添加&使用ArrayAdapter

时间:2017-03-15 12:11:17

标签: android android-layout android-arrayadapter

Screenshot of what I am making

我正在对所选联系人进行气泡显示。每个电话气泡都是LinearLayout,其中包含ImageView和TextView。然后这些气泡显示在另一个LinearLayout中,它是Horizo​​ntalScrollView的子代。

它的子/父树看起来像这样:

 - 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?

2 个答案:

答案 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();
        }
    });
}

希望它会帮助你。