更新的回复:
使用CarItems列表的替代方案:
@OnClick(...)
public void onButtonClicked() {
int size = ((MyCustomAdapter) mRecyclerView.getAdapter()).getItemCount();
for (int i = 0; i < size; i++) {
if (((MyCustomAdapter) mRecyclerView.getAdapter()).isItemChecked(i)) {
CarItem carItem = (MyCustomAdapter) mRecyclerView.getAdapter()).getItem(i);
}
}
}
您可以在适配器中添加一个
getCheckedItems()
方法:
public List<CarItem> getCheckedItems() {
List<CarItem> checkedItems = new ArrayList<>();
for (int i = 0; i < getItemCount(); i++) {
if (isItemChecked(i)) {
checkedItems.add(getItem(i));
}
}
return checkedItems;
}
然后像这样从RecyclerView
中使用它:
((MyCustomAdapter) mRecyclerView.getAdapter()).getCheckedItems()
有没有一种方式可以从RecyclerView的适配器中返回数据到我设置它的Fragment中?
通常来说,要从您的Fragment中操作数据:
将以下方法添加到适配器中,并通过将其转换为您的自定义适配器,从Fragment中调用它们:((MyCustomAdapter) mRecyclerView.getAdapter()).getItem(...);
public void setListItems(List<CarItem> data) {
this.data = data;
}
public List getListItems() {
return data;
}
@Override
public int getItemCount() {
return this.data.size();
}
public CarItem getItem(int position) {
return data.get(position);
}
public void setItem(CarItem item, int position) {
data.set(position, item);
}
我有一个RecyclerView,在RecyclerView的每个对象中都有一个复选框。每次按下其中一个复选框,我想在适配器中插入数据。
管理多选状态和保存状态
请阅读此解释,并查看此多选示例应用程序。
该库还使用SparseBooleanArray扩展了选择适配器以保存所选项目。
或者使用以下方法保存选中状态,并在单击按钮时仅访问所选项目的数据:
public class MyCustomAdapter extends RecyclerView.Adapter<MyCustomAdapter.MyCustomViewHolder> {
private ArrayList<CarItem> data;
private SparseBooleanArray checkedState = new SparseBooleanArray();
public void setCheckedState(int position, boolean checked) {
checkedState.append(position, checked);
}
public boolean isItemChecked(int position) {
return checkedState.get(position);
}
public SparseBooleanArray getCheckedState() {
return checkedState;
}
public void onBindViewHolder(final MyCustomViewHolder holder, final int position) {
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
setCheckedState(holder.getAdapterPosition(), isChecked);
if (isChecked) {
data.set(holder.getAdapterPosition(), holder.getItem());
} else {
data.set(holder.getAdapterPosition(), null);
}
}
});
}
这个与Google I/O 2016相关的视频中使用适配器位置的原因:
![enter image description here](https://istack.dev59.com/tPnoy.webp)
我创建了getItem()方法以获取MyCustomViewHolder内的数据,但我不知道如何将数据返回到将Adapter设置为RecyclerView的Fragment中。
向视图持有者设置/获取数据
这些方法也可以通过使用setTag()/getTag()机制来获取数据。
viewHolder.itemView.setTag(yourNewData);
@ViewDebug.ExportedProperty
public Object getTag() {
return mTag;
}
public void setTag(final Object tag) {
mTag = tag;
}
有一次,我完成了(按下片段上的一个按钮,将适配器设置为RecyclerView),数据必须返回。关于在数据返回时你要做什么以及在此处再次将适配器设置为RecyclerView的原因,我需要额外的信息。
可以使用
findViewHolderForAdapterPosition(int)方法。
public ViewHolder findViewHolderForAdapterPosition(int position) {
if (mDataSetHasChangedAfterLayout) {
return null;
}
final int childCount = mChildHelper.getUnfilteredChildCount();
for (int i = 0; i < childCount; i++) {
final ViewHolder holder = getChildViewHolderInt(mChildHelper.getUnfilteredChildAt(i));
if (holder != null && !holder.isRemoved() && getAdapterPositionFor(holder) == position) {
return holder;
}
}
return null;
}
@OnClick(...)
public void onButtonClicked() {
int size = ((MyCustomAdapter) mRecyclerView.getAdapter()).getItemCount();
for (int i = 0; i < size; i++) {
ViewHolder vh = (MyCustomViewHolder) findViewHolderForAdapterPosition(i);
if (vh != null && ((MyCustomAdapter) mRecyclerView.getAdapter()).isItemChecked(i)) {
Object obj = vh.itemView.getTag();
}
}
}
getItem()
方法的内容,只能在控制台上记录日志。我创建它是为了尝试在设置适配器到回收视图的类中获取数据。 - Francisco Romeropublic List<CarItem> data;
不是在适配器里吗? - albodelu