Recycler Adapter& loaderManager,当新项目进入

时间:2015-10-19 07:59:12

标签: android android-recyclerview android-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{
    ...
}

1 个答案:

答案 0 :(得分:0)

@Zoedia我认为它是如何工作的,当新物品出现时,你的当前物品显然会向下滚动。

您可以尝试在HttpUtility.UrlDecode(myComment) 中显示新项目,同时从顶部提供浮动按钮并要求用户点击按钮或Recycler View加载新项目。这将帮助您阅读当前正在阅读的内容,并且只要用户点击该按钮,就会显示新项目(Recycler View将使用新项目进行充气)。

它类似于Facebook Android App实施(新故事按钮):

enter image description here

编辑1: 要在特定位置添加项目,您必须在0 th /初始位置添加装载项中的项目,因为您希望新的Feed位于顶部。 之后,调用Swipe-to-Refresh以反映mAdapter.notifyDataSetChanged();中包含新元素的更改。

如果您使用Recycler view,则只需调用ArrayList<>方法添加单个项目或.add(listitem,position)即可添加所有ArrayList。 然后拨打.addAll(list,position)