我正在对所选联系人进行气泡显示。每个电话气泡都是LinearLayout,其中包含ImageView和TextView。然后这些气泡显示在另一个LinearLayout中,它是HorizontalScrollView的子代。
它的子/父树看起来像这样:
- HorizontalScrollView
|- LinearLayout (id="@+id/telField")
|- LinearLayout (id="@+id/telBox") <- is programmatically added to parent
|- TextView (id="@+id/telNumber")
|- ImageView (id="@+id/delNumber")
在我的.java类中,我调用此方法来显示&#34; telBox&#34; &#34; telField&#34;中的LinearLayout的LinearLayout:
public void createAdapter() {
telList = new ArrayAdapter<>(this, R.layout.text_buble, R.id.telNumber, telNumList);
telField = (LinearLayout) findViewById(R.id.telField);
telField.removeAllViews();
final int adapterCount = telNumList.size();
for (ik = 0; ik < adapterCount; ik++) {
final View item = telList.getView(ik, null, null);
telField.addView(item);
item.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
telField.removeView(item);
telNumList.remove(ik-1);
telList.notifyDataSetChanged();
refresh();
}
});
}
}
方法refresh();
- 是自定义方法,有助于重新加载&#34;活动:它获取App值,刷新警告ImageViews和 cals createAdapter()方法。
大按钮&#34; SELECT&#34;调用一个Intent,它从联系人簿中返回一个选定的电话号码。我将此代码称为更新我的LinearLayout,其ID为&#34; telField&#34;:
telNumList.add(cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)));
createAdapter();
我面临的问题是:
点击带有ID&#34; telNumber&#34;的LinearLayout后它一个接一个地删除每个气泡(无论我点击哪个气泡),直到它到达第一个添加的气泡。到达第一个添加元素时它也会崩溃50/50,我还没有想出依赖。它返回的错误是&#34;越界错误&#34;,所以我认为它与
ik - 1
行相关联。
我的问题是:如何更好地构建ArrayAdapter?
答案 0 :(得分:2)
在您的代码中,您试图通过ik
删除视图,该视图会不断变化,因为您的编码正在删除最后一个视图我修改了您的代码,如下所示
for (ik = 0; ik < adapterCount; ik++) {
final int position=ik;
final View item = telList.getView(ik, null, null);
telField.addView(item);
item.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
telField.removeView(item);
telNumList.remove(position);
telList.notifyDataSetChanged();
//refresh();
createAdapter();
}
});
}
此处position
将帮助您删除要删除的特定视图。我希望这就是你要求的。
答案 1 :(得分:1)
在for循环中,写下以下代码行:
for (ik = 0; ik < adapterCount; ik++) {
final View item = telList.getView(ik, null, null);
item.setTag(ik);
telField.addView(item);
item.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
int index = Integer.parseInt(v.getTag().toString());
telNumList.remove(index);
refresh();
}
});
}
希望它会帮助你。