当前位置: 代码迷 >> Android >> 回收站适配器和loaderManager,当有新物品进入时,当前查看的物品会下降
  详细解决方案

回收站适配器和loaderManager,当有新物品进入时,当前查看的物品会下降

热度:15   发布时间:2023-08-04 10:11:48.0

我是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{
    ...
}

@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();