在recyclerview中更改数据

时间:2015-05-09 14:29:48

标签: android android-recyclerview

似乎我仍然无法掌握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;
    }
}

2 个答案:

答案 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错误..