【问题标题】:How to keep track of dynamic indices of ArrayList of view rows如何跟踪视图行的 ArrayList 的动态索引
【发布时间】: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会更好。会轻松很多stackoverflow.com/questions/26076965/…
  • 我没有任何 listView,我使用的是 ExpandableRecyclerView。每一行都是动态的,所以我将每一行的属性存储在一个 ArrayList 中。当片段被隐藏并再次显示时,我正在使用 ArrayList 重建所有行。我唯一的问题是我无法跟踪 OnClickListener 中的行索引。

标签: java android arraylist view


【解决方案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());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多