使用单击 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
项目:Appliances
和 Accessories
。
默认情况下,我在 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的主要内容,如果未能解决你的问题,请参考以下文章