如何动态更新RecyclerView的数据?

时间:2015-09-09 07:26:24

标签: android android-recyclerview

我在数据库中有一些表,每个表都有很多行,我想在列表中显示表的数据,所以我使用RecyclerView来显示数据,还有一个微调器来选择表我想表现出来。

但现在,当我选择一个微调器项时,RecyclerView没有任何变化,只有在我重新打开片段后它才能显示新数据。

我的代码:

  • 在适配器中:

1。removeItem正常工作

在调用removeItem时,将删除RecyclerView中的项目。

public void removeItem(WordCls wordCls) {
    int position = wordsList.indexOf(wordCls);
    wordsList.remove(position);
    notifyItemRemoved(position);
}

2. updateList无效

但是当调用updateList时,视图中没有任何内容发生

public void updateList(List<WordCls> wordsList) {
    //this.wordsList = wordsList;
    this.wordsList.clear();
    this.wordsList.addAll(wordsList);
    notifyDataSetChanged();
}
  • 片段:
onCreateView()中的

recyclerView = (RecyclerView) view.findViewById(R.id.wordbook_recycler_list);  
recyclerView.setLayoutManager(new LinearLayoutManager(activity));
recyclerView.setItemAnimator(new DefaultItemAnimator());  
recyclerView.setHasFixedSize(true);
wordsList = WordsManager.getWordsList(tableName); 
wordCardAdapter = new WordCardAdapter(activity, tableName, wordsList);  
recyclerView.setAdapter(wordCardAdapter);
wordCardAdapter.setOnItemClickListener(new WordCardAdapter.OnRecyclerViewItemClickListener() {
    @Override
    public void onItemClick(View view, WordCls wordCls) {
        Toast.makeText(getActivity(), wordCls.getWord(), Toast.LENGTH_SHORT).show();
        wordCardAdapter.removeItem(wordCls);
        WordsManager.deleteWord(tableName, wordCls.getWord());
    }
});
SpinnerItemSelectedListener中的

@Override  
public void onItemSelected(AdapterView<?> parent, View view, int position,long id) {  
    tableName= parent.getItemAtPosition(position).toString(); 
    prefEditorSettings.putInt(KEY_SPINNER_SELECTED_ITEM, position);
    prefEditorSettings.commit();
    tableName = getWordbookList().get(spnSelectedPosition);
    wordsList = WordsManager.getWordsList(tableName);
    wordCardAdapter.updateList(wordsList);
    Toast.makeText(activity, tableName, 2000).show();   
}

============================================== <登记/> 更新:

方法updateList是对的。

只是我不小心在

传递了一个错误的参数
tableName = getWordbookList().get(spnSelectedPosition);

应该是

tableName = getWordbookList().get(position);

现在,它有效。

2 个答案:

答案 0 :(得分:1)

实际上,我不知道RecyclerView是否是实现目标的最佳方式。 当您必须以列表方式显示列表的多个实例时,将使用RecyclerView:)

如果您只有一个要更新的视图(包含要更新的多个字段),我会选择一些数据绑定库,如RoboBinding或新的测试版google binding library(MVVM范例) )

我不打算进一步了解细节,因为我只是想提醒您关于MVVM编程范例,在您的案例中这可能是一个有价值的解决方案。

答案 1 :(得分:0)

而不是wordCardAdapter.updateList(wordsList),将新数据添加到词汇表中的wordsList和wordCardAdapter.notifyDataSetChanged()

希望它有效。