如何跟踪视图行的 ArrayList 的动态索引
Posted
技术标签:
【中文标题】如何跟踪视图行的 ArrayList 的动态索引【英文标题】:How to keep track of dynamic indices of ArrayList of view rows 【发布时间】:2018-04-22 09:33:55 【问题描述】:我正在动态添加/删除行,每一行都有几个按钮,包括一个删除行的按钮。
每一行代表一个 ArrayList 的一个项目(我有一个 ArrayList 用于存储行数据列表)。
添加每一行时,我为删除按钮添加一个onClickListener:
private ArrayList<item> ItemList = new ArrayList<>();
void AddRow(item item, int index)
ItemList.add(item);
LinearLayout llItem = findViewById(R.id.llItem);
View rowview = inflater.inflate(R.layout.cardrow, null);
ImageButton btnDelete = rowview.findViewById(R.id.btnDelete);
btnDelete.setOnClickListener(new View.OnClickListener()
@Override public void onClick(View v)
list.remove(index); // <--- This is the problem, it is not dynamic
llItem.removeView((View) v.getParent());
);
llItem.addView(rowview, llItem.getChildCount());
list.remove(index) 移动较低行的索引,因此它们的 onClickListeners 可能不准确。例如:如果我添加了 3 行,点击第 1 行的删除按钮,那么最后一行指向的索引现在已经越界了。
解决此问题并使其动态化的最佳方法是什么?
有没有什么方法可以让我做类似 v.getIndex() 的事情来获取视图中行的真实索引?
【问题讨论】:
您的方法名称是AddRow()
,但您正在删除项目。请同时显示更多代码和listView
适配器代码。
它没有删除任何项目。每次调用 AddRow() 时,它都会添加 1 行可以自行删除。删除代码位于该行的删除按钮的 OnClickListener 中。它现在正在工作(添加和删除行),唯一的问题是所描述的索引不匹配,这可能导致出站异常。
如果您使用linearLayout
添加视图,为什么需要listView
? listView
包含什么?这很令人困惑。请显示更详细的代码。
如果你使用RecyclerView而不是LinearLayout会更好。会轻松很多***.com/questions/26076965/…
我没有任何 listView,我使用的是 ExpandableRecyclerView。每一行都是动态的,所以我将每一行的属性存储在一个 ArrayList 中。当片段被隐藏并再次显示时,我正在使用 ArrayList 重建所有行。我唯一的问题是我无法跟踪 OnClickListener 中的行索引。
【参考方案1】:
我没有匹配动态索引(这在静态 OnClickListener 中似乎很困难或不可能),而是在单击删除按钮时删除并重建视图。因此,每次删除行后都会立即重新生成准确的索引。
private ArrayList<item> ItemList = new ArrayList<>();
void AddRow(item item, int index)
ItemList.add(item);
LinearLayout llItem = findViewById(R.id.llItem);
View rowview = inflater.inflate(R.layout.cardrow, null);
ImageButton btnDelete = rowview.findViewById(R.id.btnDelete);
btnDelete.setOnClickListener(new View.OnClickListener()
@Override public void onClick(View v)
list.remove(index);
llItem.removeAllViews(); // <-- remove the views
for(int i=0;i<item.getSize();i++) // <-- add the rows again
AddRow(item, i); // <-- rebuild accurate indices
);
llItem.addView(rowview, llItem.getChildCount());
【讨论】:
以上是关于如何跟踪视图行的 ArrayList 的动态索引的主要内容,如果未能解决你的问题,请参考以下文章