2015-10-19 65 views
0

我是新來的機器人。回收商適配器和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{ 
    ... 
} 
+0

請發佈您的代碼,以便了解您到底在做什麼 –

+0

@vipul_asri。我添加了代碼。 – Zoedia

+0

你聲明瞭'ProverbHistoryAdapter mAdapter',然後你將'mAdapter'類型轉換爲'CustomAdapter'是不是?或者你只是犯了一個錯誤。 –

回答

0

@Zoedia我認爲它是如何工作的,當新項目進來顯然當前的項目將向下滾動。

您可以嘗試通過不顯示Recycler View中的新項目,因爲它來自頂部的浮動按鈕並要求用戶單擊按鈕或Swipe-to-Refresh加載新項目。這將幫助您閱讀您當前正在閱讀的內容,並且只要用戶點擊該按鈕,就會顯示新的內容(回收站視圖將會充滿新的內容)。

它類似於Facebook的Android應用程序實現(故事新編按鈕):

enter image description here

編輯1: 要在特定的位置添加一個項目,你必須從項目添加您的加載器在0 th /初始位置,因爲您希望新的Feed位於頂部。 之後,請致電mAdapter.notifyDataSetChanged();以反映Recycler view中的新變化。

如果您使用ArrayList<>,那麼您只需要調用.add(listitem,position)方法添加單個項目或.addAll(list,position)來添加所有ArrayList。 ,然後致電mAdapter.notifyDataSetChanged();

+0

是的。這正是我想要做的..謝謝你的例子。 Facebook的Android應用程序甚至允許用戶在沒有點擊的情況下滾動到「新故事」。我想知道它是如何檢測列表的頂部,並滾動時逐一放置每個故事。 <一次不顯示>。在我的代碼中使用CursorLoader和OnCreateLoader是否可行,以及我的「CustomAdapter」中的swapCursor如何?我是否需要玩RecyclerView LayOutManager才能更深入?因爲只要有簡單的方法,我不想去複雜。 – Zoedia

+0

@Zoedia請參閱**編輯1 **。 –

+0

謝謝@vipul_asri ..現在它可以與notifyItemRangeInserted(0,** sizeOfNewItem **)一起使用。 – Zoedia

相關問題