使用单击 Spinner 项刷新 ArrayList 以将新数据显示到 RecyclerView

Posted

技术标签:

【中文标题】使用单击 Spinner 项刷新 ArrayList 以将新数据显示到 RecyclerView【英文标题】:Refresh ArrayList to show new Data into RecyclerView using Click on Spinner Item 【发布时间】:2016-08-24 03:12:47 【问题描述】:

单击Spinner 项目将新数据添加到RecyclerView 而不删除旧数据。

比如,我在 Spinner 中有 two 项目:AppliancesAccessories

默认情况下,我在 RecyclerView 中显示 Appliances 数据,但每当我在 Accessories 上执行 tap 时 - 它会在 中显示 Accessories data RecyclerView,但 below Appliances data,而我期望只有 Accessories 数据进入 RecyclerView

MainActivity.java:

public class MainActivity extends AppCompatActivity 

    .....

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

        stringList = new ArrayList<String>();
        stringList.add("Appliances");
        stringList.add("Accessories");

        ArrayAdapter<String> stringArrayAdapter = new ArrayAdapter<String>(MainActivity.this,
                android.R.layout.simple_dropdown_item_1line,
                stringList);

        spinnerMenu.setAdapter(stringArrayAdapter);

        ......

        initializeAdapter();

        .....

        spinnerMenu.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() 
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 

                switch (position) 
                    case 0:                            

                        presenter.loadAppliances();

                        break;

                    case 1:

                        presenter.loadAccessories();

                        break;
                

            

            @Override
            public void onNothingSelected(AdapterView<?> parent) 

            
        );

        .......
    

    public void initializeAdapter() 

        categoryAdapter = new CategoryAdapter(this, new ArrayList<Category>());
        mRecyclerView.setAdapter(categoryAdapter);
    

    public void addMenu(List<Category> posts) 
        categoryAdapter.addAllData(posts);
        categoryAdapter.notifyDataSetChanged();
    


CategoryAdapter.java:

    @Override
    public int getItemCount() 
        return posts.size();
    

    public void setPosts(List<Categories> posts) 
        this.posts = posts;
    

    public void clearData() 
        posts.clear();
    

    public void addAllData(List<Categories> posts) 
        this.posts.addAll(posts);
    


【问题讨论】:

为什么它被否决了?我不认为这是我发布的错误。 在致电menuPresenter.loadAppliances(); 之前和致电notifyDataSetChanged() 之后请清除您的列表 试过但得到空指针异常 最好贴一下logcat 请出示menuPresenter.loadXXX的代码 【参考方案1】:

首先清除旧的 ArrayList,然后将数据添加到 Arraylist。

 public void addMenu(List<Category> posts) 
    categoryAdapter.addAllData(posts);
    categoryAdapter.notifyDataSetChanged();


public void addAllData(List<Categories> posts) 
    this.posts.clear();
    this.posts.addAll(posts);

【讨论】:

【参考方案2】:

您需要在选择项目时重置适配器。所以试试这个:

 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
       initializeAdapter();
       //after this the switch case

我还建议您有办法了解微调器菜单位置。 在第一个menupresenter.loadAppliances();之后有int positionSelected = 0;

那么在switch case中,

switch position
   case: 0
     if(positionSelected != 0) 
         initializeAdapter();
         menupresenter.loadAppliances();
         positionSelected = 0;
     ...

   case: 1
     if(positionSelected != 1) 
         initializeAdapter();
         menupresenter.loadAccessories();
         positionSelected = 1;
     ...      

这将确保您不会不必要地重置 recyclerView 适配器。就像正在显示应用数据并且用户在下拉列表中再次选择应用一样

【讨论】:

以上是关于使用单击 Spinner 项刷新 ArrayList 以将新数据显示到 RecyclerView的主要内容,如果未能解决你的问题,请参考以下文章

android开发--Spinner

单击管理面板侧菜单刷新页面而不是展开菜单项

单击侧菜单项时如何避免刷新页面

无法刷新 Spinner 所选项目的 ListView 以从 url 获取新数据

在 Robotium 中选择 Spinner 错误项

如何通过多项选择重新调整 Spinner 中项目的高度?