问题描述
我是android新手。
我正在尝试使用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{
...
}
1楼
@Zoedia我认为它是如何工作的,当有新物品出现时,您当前的物品显然会向下滚动。
您可以通过以下方法来解决此问题:在顶部显示“浮动按钮”并要求用户单击按钮或“ Swipe-to-Refresh
以加载新项目时,不要在Recycler View
显示新项目。
这将帮助您阅读当前正在阅读的内容,并在用户单击该按钮后立即显示新项目(Recycler View将充实新项目)。
它类似于Facebook Android App的实现(“ New Stories Button”):
编辑1:要在特定位置添加项目,您必须从装载机的第0 个 /初始位置添加项目,因为您希望新Feed位于顶部。
之后,调用mAdapter.notifyDataSetChanged();
以在Recycler view
中用新元素反映该更改。
如果使用的是ArrayList<>
,则只需调用.add(listitem,position)
方法添加单个项,或.addAll(list,position)
添加所有ArrayList。
然后调用mAdapter.notifyDataSetChanged();
。