如何刷新绑定到公共静态变量的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?!?
我不理解阻止我访问公共方法的语法和语义,就好像它们是私有的一样。
答案 0 :(得分:2)
您可以使用notifyDataSetChanged
,如果遇到渲染问题,请尝试requestLayout
和forceLayout
。
答案 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;
}