如何跟踪视图行的 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 添加视图,为什么需要listViewlistView 包含什么?这很令人困惑。请显示更详细的代码。 如果你使用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 的动态索引的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server和Oracle数据库索引介绍

索引如何作用于视图?

如何在 UIPICKERVIEW (iOS) 中获取所选行的索引号

为每个循环迭代 ArrayList 获取 a 的当前索引

如何在新视图中按新索引分组

MySQL:具有 100+ 百万行的索引表