簡體   English   中英

使用ArrayAdapter從LinearLayout添加和刪除項目

[英]Add & delete item from LinearLayout using ArrayAdapter

我正在制作的屏幕截圖

我正在對所選聯系人進行氣泡顯示。 每個電話氣泡都是一個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類中,我調用此方法在“ telField” LinearLayout中顯示“ telBox” 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(); –是自定義方法,有助於“重新加載”活動:它獲取應用程序值,刷新警告ImageViews並校准createAdapter()方法

大按鈕“ SELECT”調用一個Intent,該Intent返回通訊錄中選定的電話號碼。 我調用以下代碼來更新ID為“ telField”的LinearLayout:

telNumList.add(cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)));
createAdapter();

我面臨的問題是:

在單擊ID為“ telNumber”的LinearLayout之后,它會逐個刪除每個氣泡(無論單擊哪個氣泡),直到到達第一個添加的氣泡為止。 當到達第一個添加的元素時,它也會崩潰50/50,我還沒有弄清依賴項。 它返回的錯誤是“越界錯誤”,因此我認為它與ik - 1行連接。

我的問題是:如何更好地構造ArrayAdapter?

在您的代碼中,您嘗試通過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將幫助您刪除要刪除的特定視圖。 我希望這是您要的。

在您的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();
        }
    });
}

希望它能對您有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM