我是初学者。
我正在尝试使用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{
...
}
答案 0 :(得分:0)
@Zoedia我认为它是如何工作的,当新物品出现时,你的当前物品显然会向下滚动。
您可以尝试在HttpUtility.UrlDecode(myComment)
中显示新项目,同时从顶部提供浮动按钮并要求用户点击按钮或Recycler View
加载新项目。这将帮助您阅读当前正在阅读的内容,并且只要用户点击该按钮,就会显示新项目(Recycler View将使用新项目进行充气)。
它类似于Facebook Android App实施(新故事按钮):
编辑1:
要在特定位置添加项目,您必须在0 th /初始位置添加装载项中的项目,因为您希望新的Feed位于顶部。
之后,调用Swipe-to-Refresh
以反映mAdapter.notifyDataSetChanged();
中包含新元素的更改。
如果您使用Recycler view
,则只需调用ArrayList<>
方法添加单个项目或.add(listitem,position)
即可添加所有ArrayList。
然后拨打.addAll(list,position)
。