我正在动态添加/删除行,每行有几个按钮,包括一个删除行的按钮。
每一行代表一个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()这样的方法来获取视图中行的真实索引吗?
答案 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());
}