似乎我仍然无法掌握notifydatasetchanged的工作方式。我尝试更新适配器中的变量,但无法成功完成。我尝试过如下,也尝试定义单独的类Nav Drawer项目,但是无法做任何事情。
基本上,计数应该不时更新,所以我只需要在NavDrawer中更新它。当然,我对notifydatasetchanged如何工作有一些误解。
我非常确定我在过去使用ListView做过类似于METHOD 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 :(得分:3)
如果只更改不会更改适配器的列表mNavTitles
。
您需要在适配器中更改它,就像在构造函数中一样:
public void updateList(String[] mNavTitles) {
this.mNavTitles = mNavTitles;
}
然后调用notifyDataSetChanged,如果有任何更改或添加,将调用它,并调用适当的onBindViewHolder或onCreateViewHolder方法。
答案 1 :(得分:0)
我想如果我理解你是正确的,那么你会得到一个包含20个值的字符串数组。您正在传递计数(即要显示的项目数)以更新列表中的项目数,例如10或20.问题是即使您更新计数,回收器视图方法getItemCount()
正在返回{{1}即所有这些。因此,无论计数值如何,都会生成整个列表。所以一个解决方案是:
在方法1
中变化
mNavTitles.length
到
@Override
public int getItemCount() {
return mNavTitles.length;
}
还要确保@Override
public int getItemCount() {
return count;
}
的值永远不会大于count
,因为如果是这样,你的代码会抛出mNavTitles.length
错误..