我是新來的機器人。回收商適配器和loaderManager,當新項目進來時,當前查看項目下降
我想在我的應用程序中用loaderManager創建一個recyclerAdapter,以異步加載來自sqlite的遊標。
當sqlite數據庫中有新的數據可用時,我想在recyclerView頂部插入新項目。但與此同時,也希望保持當前的觀看項目。
假設我正在查看項目範圍5到10,當新的10個項目進來時,當前的查看位置也應該是15到20(而不是新的5到10)。
否則,如果插入大量項目(50到60項),用戶將失去他以前正在查看的內容。
那麼,有沒有什麼辦法可以通過recyclerView和loaderManager維護當前的查看項目?如何簡單地完成?
編輯
我的代碼仍然很簡單。沒有什麼特別複雜的。但是如果你堅持,這是我的代碼。
MyActivity.java
public class MyActivity extends BaseActivity
implements LoaderManager.LoaderCallbacks<Cursor>{
private CustomAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_layout);
mAdapter = new CustomAdapter();
RecyclerView recycler = (RecyclerView) findViewById(R.id.recycler_view);
recycler.setAdapter(mAdapter);
recycler.getItemAnimator().setAddDuration(1000);
recycler.getItemAnimator().setChangeDuration(1000);
recycler.setHasFixedSize(true);
LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);
recycler.setLayoutManager(llm);
getLoaderManager().initLoader(0, null, this);
}
@Override
protected void onDestroy() {
if(mAdapter != null || mAdapter.getItemCount() != 0){
mAdapter.closeCursor();
}
super.onDestroy();
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new CursorLoader(this,buildDataUri(),null,null,null,null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
mAdapter.swapCursor(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
mAdapter.swapCursor(null);
}
CustomAdapter.java
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {
Cursor cursor;
public void swapCursor(Cursor c){
cursor = c;
if(c != null){
cursor.moveToFirst();
...
}
notifyDataSetChanged();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
CardView c = (CardView) LayoutInflater.from(parent.getContext()).inflate(R.layout.card_cardView, parent, false);
return new ViewHolder(c);
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
...
}
@Override
public int getItemCount() {
return cursor != null ? cursor.getCount() : 0;
}
public void closeCursor() {
cursor.close();
}
public static class ViewHolder extends RecyclerView.ViewHolder{
...
}
請發佈您的代碼,以便了解您到底在做什麼 –
@vipul_asri。我添加了代碼。 – Zoedia
你聲明瞭'ProverbHistoryAdapter mAdapter',然後你將'mAdapter'類型轉換爲'CustomAdapter'是不是?或者你只是犯了一個錯誤。 –