RecyclerView:如何刷新数据

时间:2017-03-24 12:01:21

标签: android android-recyclerview

如何刷新绑定到公共静态变量的RecyclerView中的内部数据? 我已经创建了这个Adapter类,并定义了所有(我认为)我需要创建一个通过RecyclerView显示的对象列表。 现在您可以在构造函数中看到,有一个内部ArrayList是通过从其他地方的公共静态ArrayList中获取数据而构建的。

public class MyListAdapter extends RecyclerView.Adapter<MyListAdapter.ViewHolder> {

private ArrayList<StatusBarNotification> myList;
Context ctx;

public class ViewHolder extends RecyclerView.ViewHolder {
    public ImageView appSmallIcon;

    public ViewHolder(View v) {
        super(v);
        appSmallIcon = // ..
     // ....
    }
}

public void add(int position, StatusBarNotification item) {
    myList.add(position, item);
    notifyItemInserted(position);
}

public void remove(StatusBarNotification item) {
    int position = myList.indexOf(item);
    myList.remove(position);
    notifyItemRemoved(position);
}

public MyListAdapter(Context context) {
    if (MyService.allMyData != null)
        myList = new ArrayList<>(MyService.allMyData);
    else
        myList = new ArrayList<>();
    ctx = context;
}

@Override
public MyListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = //... 
    ViewHolder vh = new ViewHolder(v);
    return vh;
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    // ....
}

@Override
public int getItemCount() {
    return myList.size();
}

}

创建RecyclerView并且应用程序正在运行后,我应该怎样做才能通知外部myAllData ArrayList已更改,或者添加或删除了某个项目?我试图调用notifyDataSetChanged()但没有任何反应。奇怪的是(当然在我看来)是我无法访问add(),remove()等方法。

假设notifyDataSetChanged()是正确的道路,我应该在哪里放置一个监听器以实际更新内部数据并要求RecyclerView刷新屏幕?我应该使用Intent来与我的适配器通信吗?

而且,为什么Java阻止我做这样的事情:

MyListAdapter myLA = new MyListAdapter(....);
myLA.remove(item);    // <-- why the public method remove() is not available?!?

我不理解阻止我访问公共方法的语法和语义,就好像它们是私有的一样。

3 个答案:

答案 0 :(得分:2)

您可以使用notifyDataSetChanged,如果遇到渲染问题,请尝试requestLayoutforceLayout

答案 1 :(得分:1)

似乎我的问题是我认为我需要保留一个内部私有变量,与要显示的真实外部数据同步。我错了:必须通过引用直接链接到必须显示的数据。私有副本只是对公共数据的私有引用,因此在构造函数中复制已寻址的数据是错误的。 此时,如果适配器的构造函数被提供了对某个数据对象的引用,则可以使用notifyDataSetChanged()在每次更改时通知它。

答案 2 :(得分:0)

试一下

public MyListAdapter(Context context) {
if (MyService.allMyData != null)
{
   // myList = new ArrayList<>(MyService.allMyData); // This type of initialization don't allow mofification in list. or you can do this 

      myList = new ArrayList<>(Arrays.asList(MyService.allMyData));
      // or 
      myList = new ArrayList<>();
      myList.addAll(MyService.allMyData);
 }
  else
    myList = new ArrayList<>();
    ctx = context;
}