2017-03-14 1 views
0

Es gibt eine Aktivität, in der mehrere Fragmente vorhanden sind.Laden Sie mehr Recycler-Ansicht mit SQLite-Datenbank

Das erste Fragment ist WriteFragment, in dem zwei Textfelder bearbeiten, eine Schaltfläche zum Einfügen und eine Schaltfläche zum Lesen.

Wenn Sie auf die Schaltfläche Einfügen klicken, werden die Einträge, die im Feld Bearbeiten angezeigt werden, in die SQLite-Datenbank eingefügt.

Durch Klicken auf die Schaltfläche Lesen werden Daten aus der SQLite-Datenbank gelesen und in der Recycler-Ansicht angezeigt.

jedoch Daten sollten in Bündel von maximal 4.

gezeigt werden, wenn Benutzer am Boden erreicht, sollte es für 2 Sekunden zyklische Fortschrittsbalken zeigen, nach dem es einen weiteren Satz mit maximal 4 Daten anzeigen soll.

Wenn die verbleibenden Daten weniger als 4 sind, sollten sie sofort angezeigt werden.

Nun ist das Problem: -

Leseaufruf liest Daten von Anfang an jedes Mal, obwohl ich Anfang bin ändern, Ende und Schlitz (Bund, gesetzt) ​​jedes Mal Werte.

Angenommen, es gibt 4 Daten und ich rufe read_fragment. Es zeigt die ersten 4 Daten richtig an. Jetzt gehe ich zurück zu write_fragment und führe einen Insert-Vorgang durch. Jetzt, wenn ich lese_fragment anrufe, zeigt es zunächst 4 Daten an und dann nach dem zyklischen Fortschrittsbalkenladen für 2 Sekunden, zeigt es noch einmal diese 4 Daten und dann zeigt es Rest der Daten an. Der Prozess wiederholt sich!

Ich kann nicht verstehen, warum es die gleichen Daten lädt ?! Warum funktioniert die Methode loadMoreData() nicht wie erwartet ?!

Unten ist meine DBHelper Klasse: _

public class DBHelper extends SQLiteOpenHelper { 

private static String MyDb = "MyDb.db"; 
private static String MyTable = "MyTable"; 
private static String id = "id"; 
private static String fname = "fname"; 
private static String lname = "lname"; 
private static int version = 1; 
private static final ArrayList<User> list = new ArrayList<>(); 

private static final String sql = "create table " + MyTable + " (" + id + " integer primary key autoincrement, " 

                + fname + " text, " 

                + lname + " text)"; 

DBHelper(Context context) { 
    super(context, MyDb, null, version); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL(sql); 
} 

void insert (User user) { 

    SQLiteDatabase sqLiteDatabase = getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(fname, user.getFname()); 
    contentValues.put(lname, user.getLname()); 
    sqLiteDatabase.insert(MyTable, id, contentValues); 
    sqLiteDatabase.close(); 
} 

ArrayList<User> read() { 

    /*We are required to have readable database to read data*/ 

    SQLiteDatabase sqLiteDatabase = getReadableDatabase(); 

    /*Columns that we want to read*/ 

    String [] columns = {id, fname, lname}; 

    /*Query to read database*/ 

    Cursor cursor = sqLiteDatabase.query(MyTable, columns, null, null, null, null, null); 

    /*cursor.move(cursorPosition);*/ // Move the cursor by a relative amount, forward or backward, from the current position. 

    /*cursor.moveToPosition(cursorPosition);*/ // Move the cursor to an absolute position. 

    while (cursor.moveToNext()){ 

     int id = cursor.getInt(0); 
     String fname = cursor.getString(1); 
     String lname = cursor.getString(2); 

     User user = new User(); 
     user.setId(id); 
     user.setFname(fname); 
     user.setLname(lname); 
     list.add(user); 
    } 

    return list; 
} 

public void deleteItem(int position) { 

    //Open the database 

    SQLiteDatabase database = this.getWritableDatabase(); 

    //Execute sql query to remove from database 

    //NOTE: When removing by String in SQL, value must be enclosed with '' 

    /*Following is the query way to delete an item. We can also perform, call delete function on our database as well*/ 

    database.execSQL("DELETE FROM " + MyTable + " WHERE " + id + "= '" + position + "'"); 

    //Close the database 

    database.close(); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

} 

}

Unter meiner read_fragment Klasse: _

public class ReadFragment extends android.app.Fragment { 

RecyclerView recyclerView; 

RvAdapter rvAdapter; 

ArrayList<User> ulist = new ArrayList<>(); 

ArrayList<User> partialList = new ArrayList<>(); 

User udata = new User(); 

public ReadFragment() { 

    // Required empty public constructor 
} 

@Override 

public View onCreateView(LayoutInflater inflater, ViewGroup container, 

         Bundle savedInstanceState) { 

    // Inflate the layout for this fragment 

    View v = inflater.inflate(R.layout.fragment_read, container, false); 

    recyclerView = (RecyclerView) v.findViewById(R.id.recyclerView); 

    DBHelper dbHelper = new DBHelper(getActivity()); 

    ulist = dbHelper.read(); 

    loadMoreData(); 

    rvAdapter = new RvAdapter(partialList, recyclerView, getActivity()); 

    recyclerView.setAdapter(rvAdapter); 

    rvAdapter.notifyDataSetChanged(); 

    rvAdapter.setOnLoadMoreListener(new OnLoadMoreListener() { 

     @Override 

     public void onLoadMore() { 

      Log.e("onLoadMore", "Load More"); 

      partialList.add(null); // Adding null will give ItemViewType as cyclic progressBar to viewHolder 

      rvAdapter.notifyItemInserted(partialList.size() - 1); 

      //Load more data for reyclerview 

      new Handler().postDelayed(new Runnable() { 

       @Override 
       public void run() { 

        Log.e("run", "Load More 2"); 

        //Remove loading item 

        partialList.remove(partialList.size() - 1); // This will remove cyclic progressBar 

        rvAdapter.notifyItemRemoved(partialList.size()); 

        //Load data 

        loadMoreData(); 

        rvAdapter.notifyDataSetChanged(); 

        rvAdapter.setLoaded(); 

       } 

      }, 2000); 
     } 
    }); 

    return v; 
} 

public void loadMoreData() { 

    int end = ulist.size() - 1; 

    int start = partialList.size(); 

    int bunch = start + 3; 

    if (bunch <= end) { 

     for (int i = start; i <= bunch; i++) { 

      udata = ulist.get(i); 

      partialList.add(udata); 
     } 

    } else { 

     for (int i = start; i <= end; i++) { 

      udata = ulist.get(i); 

      partialList.add(udata); 
     } 
    } 

} 

}

Unten ist meine RecyclerView Adapter-Klasse: _

class RvAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

private final int VIEW_TYPE_ITEM = 0; 

private final int VIEW_TYPE_LOADING = 1; 

private boolean isLoading; 

private int visibleThreshold = 5; 

private int lastVisibleItem, totalItemCount; 

private ArrayList<User> ulist; 

private OnLoadMoreListener mOnLoadMoreListener; 

RvAdapter(ArrayList<User> ulist, RecyclerView recyclerView, Activity activity) { 

    this.ulist = ulist; 

    final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(activity); 

    recyclerView.setLayoutManager(linearLayoutManager); 

    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 

     @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 

      super.onScrolled(recyclerView, dx, dy); 

      totalItemCount = linearLayoutManager.getItemCount(); 

      lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition(); 

      if (!isLoading && totalItemCount <= (lastVisibleItem + visibleThreshold)) { 

       if (mOnLoadMoreListener != null) { 

        mOnLoadMoreListener.onLoadMore(); 
       } 

       isLoading = true; 
      } 
     } 
    }); 
} 

void setOnLoadMoreListener(OnLoadMoreListener mOnLoadMoreListener) { 

    this.mOnLoadMoreListener = mOnLoadMoreListener; 
} 

private static class ItemViewHolder extends RecyclerView.ViewHolder { 

    private TextView tv_id, tv_fname, tv_lname; 

    private ImageButton deleteButton; 

    private ItemViewHolder(View itemView) { 

     super(itemView); 

     tv_id = (TextView) itemView.findViewById(R.id.tv_id); 

     tv_fname = (TextView) itemView.findViewById(R.id.tv_fname); 

     tv_lname = (TextView) itemView.findViewById(R.id.tv_lname); 

     deleteButton = (ImageButton) itemView.findViewById(R.id.btn_delete); 
    } 
} 

private static class LoadingViewHolder extends RecyclerView.ViewHolder { 

    private ProgressBar progressBar; 

    private LoadingViewHolder(View itemView) { 

     super(itemView); 

     progressBar = (ProgressBar) itemView.findViewById(R.id.progressBar); 
    } 
} 

@Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    if (viewType == VIEW_TYPE_ITEM) { 

     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.model, parent, false); 

     return new ItemViewHolder(view); 

    } else if (viewType == VIEW_TYPE_LOADING) { 

     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.loading_layout, parent, false); 

     return new LoadingViewHolder(view); 
    } 

    return null; 
} 

@Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 

    if (holder instanceof ItemViewHolder) { 

     User user = ulist.get(position); 

     ItemViewHolder userViewHolder = (ItemViewHolder) holder; 

     userViewHolder.tv_id.setText(String.valueOf(user.getId())); 

     userViewHolder.tv_fname.setText(user.getFname()); 

     userViewHolder.tv_lname.setText(user.getLname()); 

    } else if (holder instanceof LoadingViewHolder) { 

     LoadingViewHolder loadingViewHolder = (LoadingViewHolder) holder; 

     loadingViewHolder.progressBar.setIndeterminate(true); 
    } 
} 

@Override public int getItemCount() { 

    return ulist == null ? 0 : ulist.size(); 
} 

@Override public int getItemViewType(int position) { 

    return ulist.get(position) == null ? VIEW_TYPE_LOADING : VIEW_TYPE_ITEM; 
} 

void setLoaded() { 

    isLoading = false; 
} 

}

ich auch folgende Logik für loadMoreData versucht haben(): _

start = partialList.size(); 

    for (int i = start; i <= start + 3; i++) { 

     if (ulist.size() > slot) { 

      slot = i + 1; 

      udata = ulist.get(i); 

      partialList.add(udata); 
     } 
    } 

    start = partialList.size(); 

jedoch ohne Glück, noch bin ich Liste von Anfang an immer nach jedem Scroll-Ereignis! !!

Jede Hilfe wird geschätzt. Vielen Dank im Voraus für Ihre wertvolle Zeit.

Antwort

0

können Sie überprüfen Sie diesen Link für Load Mehr RecyclerView und Bottom ProgressBar Load More RecyclerView and Bottom ProgressBar

+0

können Sie mir sagen, warum die Variable int I innerhalb for loop der Methode LoadMoreData() immer mit 0 für jedes Scroll-Ereignis beginnt? Aus diesem Grund glaube ich, dass ich nach jedem Scroll-Event Daten von Anfang an bekomme !!! Du kannst mich darauf hinweisen, wenn der Grund etwas anderes ist !!! –

0

Der Grund, warum ich wegen der endgültigen Arraylist gleichen Daten mehrfach war bekam.Also, es ist etwas wie, endgültige Schlüsselwort setzt die Variable mit festen Wert, aber als ich diese Variable irgendwie änderte, gab es mir neue Liste jedes Mal, die offensichtlich alle Werte einschließlich der neuen hätte. Es ist also so, als würde jedes Mal ein neues Objekt von ArrayList erstellt. Wenn jedoch jemand bestätigen kann, was ich abgeschlossen habe und den Prozess hinter der Szene in klarer und besserer Weise erklären, wird es geschätzt.