0

この同じ問題に関して、すでに多くの質問があることは承知しています。

私のは少し奇妙に見えます!モデルの ArrayList を渡す ListView 用のカスタム アダプターがあります。このリストにコンテキスト メニューを設定しました。[削除] をクリックすると、ListView から行を削除する必要があります (その場で更新します)。

を呼び出しxxxxx.remove(info.position)listadapter.notifyDataSetChanged()いますが、ListView に存在していた最後の行が複製されます。

コードは次のとおりです。

ListView のアダプター:

クラス MyAdapter は ArrayAdapter を拡張します {

private final Context context;
private final ArrayList<ListModel> itemsArrayList;

public MyAdapter(Context context, ArrayList<ListModel> itemsArrayList) {

    super(context, R.layout.viewlistitems, itemsArrayList);
    this.context = context;
    this.itemsArrayList = itemsArrayList;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View rowView = null;

    if (convertView == null) {

    LayoutInflater inflater = (LayoutInflater) context
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    //Get rowView from inflater
    rowView = inflater.inflate(R.layout.viewlistitems, parent, false);
    }
    else
        rowView = convertView;

    // 3. Get the two text view from the rowView
    TextView listNameView = (TextView) rowView.findViewById(R.id.listName);

    listNameView.setTypeface(ViewListActivity.segoe);
    listDateView.setTypeface(ViewListActivity.openSansLightIt);

    String listName1 = itemsArrayList.get(position).getListName();
    String listName2 = listName1.substring(0,1).toUpperCase() + listName1.substring(1);


    listNameView.setText(listName2);

    return rowView;
}

}

コンテキストメニュー:

public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
      if (v.getId()==R.id.ListView01) {
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo;
        menu.setHeaderTitle(todoItems.get(info.position).getListName());
        String[] menuItems = {"Delete"};
        for (int i = 0; i<menuItems.length; i++) {
          menu.add(Menu.NONE, i, i, menuItems[i]);
        }
      }
    }

public boolean onContextItemSelected(MenuItem item) {
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item
            .getMenuInfo();

    if(item.getTitle().equals("Delete")) {
    Toast.makeText(this,
            todoItems.get(info.position).getListName() + " deleted!",
            Toast.LENGTH_SHORT).show();

    todoItems.remove(info.position);

    //newList.invalidateViews();
    adapter.notifyDataSetChanged();

    }
     return true;
    }

1 日以来、このバグを修正できません! なぜこれが起こっているのか、何が原因なのか、何か考えはありますか?

どうもありがとう!

4

3 に答える 3

1

これの代わりに:

if (convertView == null) {
    LayoutInflater inflater = (LayoutInflater) context
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    // Get rowView from inflater
    rowView = inflater.inflate(R.layout.viewlistitems, parent, false);
    }
    else
        rowView = convertView;

これを試して:

LayoutInflater inflater = (LayoutInflater) context
    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

// Get rowView from inflater
rowView = inflater.inflate(R.layout.viewlistitems, parent, false);

また、アイテムを削除した後、アイテムを削除することをアダプタークラスに通知しないでください。アダプターアイテムはtemsArrayList

したがって、Adapter クラスに 1 つのメソッドを作成し、この新しい arraylist を渡します。

private viod methodName(arraylist list)
{
temsArrayList=list;
notifyDataSetChanged();
}

その後、呼び出す必要はありませんadapter.notifyDataSetChanged(); Calladapter.methodName(newArraylist)

于 2013-12-13T20:11:22.837 に答える