2015-05-09 35 views
0

好像我仍然無法掌握notifydatasetchanged的工作方式。我試圖更新適配器中的變量,但無法成功完成。我試着像下面這樣,也嘗試定義單獨的類Nav Drawer項目,但只是無法做任何事情。更改recyclerview中的數據

基本上,計數應該不時更新,所以我只需要在NavDrawer中進行更新。肯定我有一些誤解notifydatasetchanged如何工作。

我很確定我在過去使用ListView做了一些類似於方法2的事情。唯一不同的是,在這種情況下,我使用了ArrayList,但是我直接在NavDrawerList中存儲數組並將其傳遞給適配器。

方法1種

public class ActivityMain extends AppCompatActivity{ 

    private String[] navMenuTitles; 
    public int count; 

    RecyclerView mRecyclerView; 
    RecyclerView.Adapter mAdapter; 
    RecyclerView.LayoutManager mLayoutManager; 
    DrawerLayout mDrawerLayout; 
    ActionBarDrawerToggle mDrawerToggle; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items); 
     count = 20; 

     mRecyclerView = (RecyclerView) findViewById(R.id.RecyclerView); 
     mRecyclerView.setHasFixedSize(true); 
     mAdapter = new NavDrawerAdapter(navMenuTitles, count); 
     mRecyclerView.setAdapter(mAdapter); 
     mLayoutManager = new LinearLayoutManager(this); 
     mRecyclerView.setLayoutManager(mLayoutManager); 
     mDrawerLayout = (DrawerLayout) findViewById(R.id.DrawerLayout); 

     mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.openDrawer, R.string.closeDrawer); 
     mDrawerLayout.setDrawerListener(mDrawerToggle); 
    } 

    public void updateCount(){ 
     count = 10; 
     mAdapter.notifyDataSetChanged(); // DRAWER STILL SHOWS 20 EVEN IF I CALL THIS FUNCTION 
    } 
} 





public class NavDrawerAdapter extends RecyclerView.Adapter<NavDrawerAdapter.ViewHolder> { 
    private String[] mNavTitles; 
    private int count; 

    public NavDrawerAdapter(mNavTitles, mCount){ 
     this.mNavTitles = mNavTitles; 
     this.count = mCount; 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder { 
     TextView textView; 
     TextView counter; 

     public ViewHolder (View itemView) { 
      textView = (TextView) itemView.findViewById(R.id.title); 
      counter = (TextView) itemView.findViewById(R.id.counter); 
     } 
    } 

    @Override 
    public NavDrawerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.navdrawer_item,parent,false); 
     return new ViewHolder(v); 
    } 

    @Override 
    public void onBindViewHolder(NavDrawerAdapter.ViewHolder holder, int position) { 
     holder.textView.setText(mNavTitles[position]); 
     holder.counter.setText("" + _count); 
    } 

    @Override 
    public int getItemCount() { 
     return mNavTitles.length; 
    } 
} 

方法2

public class ActivityMain extends AppCompatActivity{ 

     private String[] navMenuTitles; 
     private NavDrawerList navDrawerList; 

     RecyclerView mRecyclerView; 
     RecyclerView.Adapter mAdapter; 
     RecyclerView.LayoutManager mLayoutManager; 
     DrawerLayout mDrawerLayout; 
     ActionBarDrawerToggle mDrawerToggle; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items); 

      mRecyclerView = (RecyclerView) findViewById(R.id.RecyclerView); 
      mRecyclerView.setHasFixedSize(true); 
      mAdapter = new NavDrawerAdapter(new NavDrawerList(navMenuTitles, 20)); 
      mRecyclerView.setAdapter(mAdapter); 
      mLayoutManager = new LinearLayoutManager(this); 
      mRecyclerView.setLayoutManager(mLayoutManager); 
      mDrawerLayout = (DrawerLayout) findViewById(R.id.DrawerLayout); 

      mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.openDrawer, R.string.closeDrawer); 
      mDrawerLayout.setDrawerListener(mDrawerToggle); 
     } 

     public void updateCount(){ 
      navDrawerList.setNavCount(10); 
      mAdapter.notifyDataSetChanged(); // DRAWER STILL SHOWS 20 EVEN IF I CALL THIS FUNCTION 
     } 
    } 





    public class NavDrawerAdapter extends RecyclerView.Adapter<NavDrawerAdapter.ViewHolder> { 
     private String[] mNavTitles; 
     private int count; 

     public NavDrawerAdapter(mNavTitles, mCount){ 
      this.mNavTitles = navDrawerList.getNavTitles(); 
      this.count = navDrawerList.getNavCount(); 
     } 
    } 

public class NavDrawerList { 
    private String[] navTitles; 
    private int navCount; 

    public NavDrawerList(String[] navTitles, int navCount){ 
     this.navTitles = navTitles; 
     this.navCount = navCount; 
    } 

    public String[] getNavTitles(){ 
     return navTitles; 
    } 

    public int getNavCount(){ 
     return navCount; 
    } 

    public void setNavCount(int navCount){ 
     this.navCount = navCount; 
    } 
} 
+0

您的'updateCount()'只會更新Activity類中的變量,而不是您的Adapter類中的變量。 – hidro

回答

3

如果你改變只是你的名單mNavTitles不會更改適配器。

你需要改變它的內部適配器,就像你在構造函數中所做的:

public void updateList(String[] mNavTitles) { 
    this.mNavTitles = mNavTitles; 
} 

然後調用notifyDataSetChanged將制定出如果有什麼改變或添加並調用相應的onBindViewHolder或onCreateViewHolder方法。

+0

我試過了,但是無法從我的ActivityMain訪問mAdapter.updateList(String).... – abdfahim

+1

不要實例化'RecyclerView.Adapter mAdapter = new NavDrawerAdapter(...);',而是'NavDrawerAdapter mAdapter =新的NavDrawerAdapter(..);'然後你可以寫'updateList'方法並從activity中調用它 – Gudin

0

我想如果我明白你是正確的,那麼你有20個值的字符串數組。您正在傳遞一個計數(即要顯示的項目數)以更新列表中的項目數,例如10或20.問題是即使您更新計數回收站視圖方法getItemCount()返回mNavTitles.length即所有這些。所以整個列表都是不考慮計數值的。所以,一個解決方案將是:

在你方法1

變化

@Override 
public int getItemCount() { 
    return mNavTitles.length; 
} 

@Override 
public int getItemCount() { 
    return count; 
} 

也確保的count值永遠不會比mNavTitles.length更大,因爲如果所以,你的代碼會拋出index out of bounds錯誤..