我应该如何在具有列表大小的 RecyclerView Adapter 中初始化一个数组,而该列表在 Adapter 构造中不可用?
How should I initialize an array inside RecyclerView Adapter which has the size of a list while the list will not available on Adapter construction?
我有一个 RecyclerView
,其中包含从 Internet 检索到的项目列表。所以一开始,列表是空的。从互联网上检索到数据后,它将更新列表并调用 notifyDataSetChanged()
.
我可以将数据改编成RecyclerView
就好了。但是,我为每个项目都有一个 ImageButton
,如果单击它,它具有不同的图像。如果我在 onBindViewHolder
中初始化标志数组,每次滚动 RecyclerView
时,标志数组将重新初始化为 false
。如果我在 Adapter
构造函数中初始化它,它将是 0 索引,因为列表一开始是空的。如果数据会在一段时间后到达,我应该把数组初始化放在适配器的什么地方?
下面是我的代码,但是每次滚动 RecyclerView
.
时,标志数组 (isTrue
) 总是重新初始化
public class SomethingAdapter extends RecyclerView.Adapter<SomethingAdapter.ViewHolder> {
private ArrayList<String> someList;
private boolean[] isTrue;
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView someText;
public ImageButton someButton;
public ViewHolder(View v) {
super(v);
someText = (TextView) v.findViewById(R.id.text);
someButton = (ImageButton) v.findViewById(R.id.button);
}
}
public SomethingAdapter(ArrayList<String> someList) {
this.someList = someList;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.some_layout, parent, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
//TODO: This thing will make isTrue always reinitialize if scrolled
this.isTrue = new boolean[someList.getResults().size()];
viewHolder.someText.setText(someList.get(position));
if (isTrue[position]) {
viewHolder.someButton.setImageResource(R.drawable.button_true);
} else {
viewHolder.someButton.setImageResource(R.drawable.button_false);
}
viewHolder.someButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isTrue[position]) {
//Connect to the internet and if response is positive {
//isTrue[position] = false;
//viewHolder.someButton.setImageResource(R.drawable.button_false);
//}
} else {
//Connect to the internet and if response is positive {
//isTrue[position] = true;
//viewHolder.someButton.setImageResource(R.drawable.button_true);
//}
}
}
});
}
@Override
public int getItemCount() {
return someList.size();
}
将项目添加到 someList
时初始化它。
此外,不要在您的 onBind 中添加点击侦听器,请在 onCreateViewHolder
中创建它。您不能在点击回调中使用位置,而应该使用 ViewHolder#getAdapterPosition。
有关详细信息,请参阅文档:
https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#onBindViewHolder(VH, 整数)
我有一个 RecyclerView
,其中包含从 Internet 检索到的项目列表。所以一开始,列表是空的。从互联网上检索到数据后,它将更新列表并调用 notifyDataSetChanged()
.
我可以将数据改编成RecyclerView
就好了。但是,我为每个项目都有一个 ImageButton
,如果单击它,它具有不同的图像。如果我在 onBindViewHolder
中初始化标志数组,每次滚动 RecyclerView
时,标志数组将重新初始化为 false
。如果我在 Adapter
构造函数中初始化它,它将是 0 索引,因为列表一开始是空的。如果数据会在一段时间后到达,我应该把数组初始化放在适配器的什么地方?
下面是我的代码,但是每次滚动 RecyclerView
.
isTrue
) 总是重新初始化
public class SomethingAdapter extends RecyclerView.Adapter<SomethingAdapter.ViewHolder> {
private ArrayList<String> someList;
private boolean[] isTrue;
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView someText;
public ImageButton someButton;
public ViewHolder(View v) {
super(v);
someText = (TextView) v.findViewById(R.id.text);
someButton = (ImageButton) v.findViewById(R.id.button);
}
}
public SomethingAdapter(ArrayList<String> someList) {
this.someList = someList;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.some_layout, parent, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
//TODO: This thing will make isTrue always reinitialize if scrolled
this.isTrue = new boolean[someList.getResults().size()];
viewHolder.someText.setText(someList.get(position));
if (isTrue[position]) {
viewHolder.someButton.setImageResource(R.drawable.button_true);
} else {
viewHolder.someButton.setImageResource(R.drawable.button_false);
}
viewHolder.someButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isTrue[position]) {
//Connect to the internet and if response is positive {
//isTrue[position] = false;
//viewHolder.someButton.setImageResource(R.drawable.button_false);
//}
} else {
//Connect to the internet and if response is positive {
//isTrue[position] = true;
//viewHolder.someButton.setImageResource(R.drawable.button_true);
//}
}
}
});
}
@Override
public int getItemCount() {
return someList.size();
}
将项目添加到 someList
时初始化它。
此外,不要在您的 onBind 中添加点击侦听器,请在 onCreateViewHolder
中创建它。您不能在点击回调中使用位置,而应该使用 ViewHolder#getAdapterPosition。
有关详细信息,请参阅文档: https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#onBindViewHolder(VH, 整数)