如何在 Android 中跟踪 RecyclerView 中的选定项目?
How to keep track of the selected items in a RecyclerView in Android?
如何实现与 RecyclerView
一致的项目选择?我得到了 RecyclerView
回收旧视图的整个想法,什么不是。我的问题是我有一个项目列表,每个项目上都有一个图标,当单击一个项目时,图标会改变颜色。我设法实现了所有这些,但我刚刚意识到,当我向下滚动列表时,其他项目的图标也发生了变化,当我滚动回到我点击的项目时,图标不再在 "clicked color"。
有谁知道如何跟踪所选项目?我一直看到一个叫做 SparseBooleanArray
的东西,但我不确定如何实现它。
这是我的适配器代码:
public class TableRVAdapter extends RecyclerView.Adapter<TableRVAdapter.TableHolder> {
List<Tables> tableList;
private SparseBooleanArray selectedItems;
public TableRVAdapter(List<Tables> tableList)
{
this.tableList = tableList;
selectedItems = new SparseBooleanArray();
// setHasStableIds(true);
}
class TableHolder extends RecyclerView.ViewHolder
{
TextView tableTV;
CardView tableCV;
View circle;
View parentView;
TableHolder(final View itemView)
{
super(itemView);
tableTV = (TextView)itemView.findViewById(R.id.tableTV);
tableCV = (CardView)itemView.findViewById(R.id.tableCV);
circle = itemView.findViewById(R.id.statusCircle);
itemView.setClickable(true);
parentView = itemView;
tableCV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
circle.setBackgroundResource(R.drawable.circle);
}
});
}
/*
@Override
public void onClick(View view) {
if (selectedItems.get(getAdapterPosition(), false)) {
tableCV.setSelected(false);
circle.setBackgroundResource(R.drawable.circle2);
}
else {
selectedItems.put(getAdapterPosition(), true);
tableCV.setSelected(true);
circle.setBackgroundResource(R.drawable.circle);
}
}*/
}
@Override
public TableHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.table_item,parent,false);
TableHolder tableHolder = new TableHolder(view);
return tableHolder;
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView)
{
super.onAttachedToRecyclerView(recyclerView);
}
@Override
public void onBindViewHolder(TableHolder holder, int position) {
holder.tableTV.setText(tableList.get(position).getTableNumber());
}
/**
* Returns the total number of items in the data set hold by the adapter.
*
* @return The total number of items in this adapter.
*/
@Override
public int getItemCount() {
return tableList.size();
}
}
你必须像这样保存实例
if (isPressed) {
icon.setCustomIcon();
} else {
icon.setDefaultIcon();
}
如果您的自定义对象具有布尔值 isPressed 或类似的东西,这应该有效
RecyclerView.adapter 有 2 个重要函数需要覆盖:
onCreateViewHolder(parent, viewType)
onBindVIewHolder(viewholder, position)
第一个函数用于膨胀将在 recyclerview 中使用的视图,第二个函数用于将您拥有的数据绑定到该视图,从而在视图上设置正确的视图状态。
recyclerview 本身只会膨胀一定数量的视图,然后将开始重新使用已经膨胀的视图(因此是 recyclerview)。因此,您需要为 onBindViewholder() 中的每个项目设置正确的状态,并在该位置使用集合中的项目来设置正确的 viewState。
对于您的示例:根据对象中的布尔值更改图标的颜色,例如:isPressed
我知道这个问题已经得到解答,但有人可能会发现这个答案有用且简单。
回收站视图中有一种有用的方法是onViewRecycled
。
这可以帮助您摆脱压力状态。当某些元素不使用可绘制对象时,在回收器视图中使用 images/drawables 时,预览回收器视图的绘制图像将出现,并且看起来所有数据都是错误的,因为它发生在您选择的视图中.
为了以更简单的方式实现这一点,您可以使用此方法清除绘制的图像以重置其值。
例如,您将所选元素的背景标记为绿色,并且您的某些视图包含图像(注意:只有 一些你的元素),而不是像这样使用这个方法:
@Override
public void onViewRecycled(MyViewHolder holder) {
super.onViewRecycled(holder);
// Set ImageView's Drawable as transperent
holder.myImageView.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), android.R.color.transparent));
// Set background color as transperent
holder.bgContainer.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), android.R.color.transparent));
}
现在您可以管理 ArrayList
个整数和 ids/position 个选定元素(在回收器视图的项目上使用 onClick 方法)。
使用onBindViewHolder(MyViewHolder myViewHolder, int position)
可以正常填写数据。对于设置背景,您可以简单地检查 id/position 是否在 ArrayList
中(如果 true,设置背景颜色绿色 else保持原样。因为它将由onViewRecylcer方法管理,即使未选中也不会影响其他绿色背景的滚动项。
希望它能对某人有所帮助,并使带有选择的回收站视图更容易一些。
如何实现与 RecyclerView
一致的项目选择?我得到了 RecyclerView
回收旧视图的整个想法,什么不是。我的问题是我有一个项目列表,每个项目上都有一个图标,当单击一个项目时,图标会改变颜色。我设法实现了所有这些,但我刚刚意识到,当我向下滚动列表时,其他项目的图标也发生了变化,当我滚动回到我点击的项目时,图标不再在 "clicked color"。
有谁知道如何跟踪所选项目?我一直看到一个叫做 SparseBooleanArray
的东西,但我不确定如何实现它。
这是我的适配器代码:
public class TableRVAdapter extends RecyclerView.Adapter<TableRVAdapter.TableHolder> {
List<Tables> tableList;
private SparseBooleanArray selectedItems;
public TableRVAdapter(List<Tables> tableList)
{
this.tableList = tableList;
selectedItems = new SparseBooleanArray();
// setHasStableIds(true);
}
class TableHolder extends RecyclerView.ViewHolder
{
TextView tableTV;
CardView tableCV;
View circle;
View parentView;
TableHolder(final View itemView)
{
super(itemView);
tableTV = (TextView)itemView.findViewById(R.id.tableTV);
tableCV = (CardView)itemView.findViewById(R.id.tableCV);
circle = itemView.findViewById(R.id.statusCircle);
itemView.setClickable(true);
parentView = itemView;
tableCV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
circle.setBackgroundResource(R.drawable.circle);
}
});
}
/*
@Override
public void onClick(View view) {
if (selectedItems.get(getAdapterPosition(), false)) {
tableCV.setSelected(false);
circle.setBackgroundResource(R.drawable.circle2);
}
else {
selectedItems.put(getAdapterPosition(), true);
tableCV.setSelected(true);
circle.setBackgroundResource(R.drawable.circle);
}
}*/
}
@Override
public TableHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.table_item,parent,false);
TableHolder tableHolder = new TableHolder(view);
return tableHolder;
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView)
{
super.onAttachedToRecyclerView(recyclerView);
}
@Override
public void onBindViewHolder(TableHolder holder, int position) {
holder.tableTV.setText(tableList.get(position).getTableNumber());
}
/**
* Returns the total number of items in the data set hold by the adapter.
*
* @return The total number of items in this adapter.
*/
@Override
public int getItemCount() {
return tableList.size();
}
}
你必须像这样保存实例
if (isPressed) {
icon.setCustomIcon();
} else {
icon.setDefaultIcon();
}
如果您的自定义对象具有布尔值 isPressed 或类似的东西,这应该有效
RecyclerView.adapter 有 2 个重要函数需要覆盖:
onCreateViewHolder(parent, viewType)
onBindVIewHolder(viewholder, position)
第一个函数用于膨胀将在 recyclerview 中使用的视图,第二个函数用于将您拥有的数据绑定到该视图,从而在视图上设置正确的视图状态。
recyclerview 本身只会膨胀一定数量的视图,然后将开始重新使用已经膨胀的视图(因此是 recyclerview)。因此,您需要为 onBindViewholder() 中的每个项目设置正确的状态,并在该位置使用集合中的项目来设置正确的 viewState。 对于您的示例:根据对象中的布尔值更改图标的颜色,例如:isPressed
我知道这个问题已经得到解答,但有人可能会发现这个答案有用且简单。
回收站视图中有一种有用的方法是onViewRecycled
。
这可以帮助您摆脱压力状态。当某些元素不使用可绘制对象时,在回收器视图中使用 images/drawables 时,预览回收器视图的绘制图像将出现,并且看起来所有数据都是错误的,因为它发生在您选择的视图中.
为了以更简单的方式实现这一点,您可以使用此方法清除绘制的图像以重置其值。
例如,您将所选元素的背景标记为绿色,并且您的某些视图包含图像(注意:只有 一些你的元素),而不是像这样使用这个方法:
@Override
public void onViewRecycled(MyViewHolder holder) {
super.onViewRecycled(holder);
// Set ImageView's Drawable as transperent
holder.myImageView.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), android.R.color.transparent));
// Set background color as transperent
holder.bgContainer.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), android.R.color.transparent));
}
现在您可以管理 ArrayList
个整数和 ids/position 个选定元素(在回收器视图的项目上使用 onClick 方法)。
使用onBindViewHolder(MyViewHolder myViewHolder, int position)
可以正常填写数据。对于设置背景,您可以简单地检查 id/position 是否在 ArrayList
中(如果 true,设置背景颜色绿色 else保持原样。因为它将由onViewRecylcer方法管理,即使未选中也不会影响其他绿色背景的滚动项。
希望它能对某人有所帮助,并使带有选择的回收站视图更容易一些。