2015-05-09 57 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错误..