如何跟踪视图行的ArrayList的动态索引

时间:2018-04-22 09:33:56

标签: java android arraylist view

我正在动态添加/删除行,每行有几个按钮,包括一个删除行的按钮。

每一行代表一个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)会移动较低行的索引,因此它们的onClickListener可能不准确。例如:如果我添加3行,请单击第1行的删除按钮,然后最后一行指向现在已经过时的索引。

解决此问题并使其动态化的最佳方法是什么?

有什么方法可以做一些像v.getIndex()这样的方法来获取视图中行的真实索引吗?

1 个答案:

答案 0 :(得分:0)

不是匹配动态索引(在静态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());
}