0

リストビューがあり、テキストビューと画像ボタン(削除)があります。画像ボタンをクリックすると、行が削除され、リストビューが更新されます。

すべて正常に機能していますが、問題は、リストビューに複数の行がある場合、1つの行を削除した後、位置の値が適切でないために他の行を削​​除できないことです。

明確にするために、例えば:リストビューには3行あります。

  • 最初の行をクリックして削除し(位置の値は0)、削除されてリストビューが更新されます。

これで2つの行があります

  • もう一度1行目をクリックしましたが、削除できませんでした(bcozの位置の値はリストビューで更新されていません。実際には、位置の値は0になっているはずですが、代わりに1、場合によっては2が表示されます)

これが私のコードです、

CustomListView.class

public View getView(final int position, View convertView, ViewGroup parent) {
    holder = null;
    DataFields rowItems = (DataFields) getItem(position);
    LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.home_field_row, null);
        holder = new ViewHolder();
        holder.dataFields = items.get(position);
        holder.mName = (TextView) convertView
                .findViewById(R.id.hmFieldName);
        holder.mDeleteImage = (ImageView) convertView
                .findViewById(R.id.hmFieldDeleteImage);
        holder.mDeleteImage.setTag(position);

        holder.mDeleteImage
                .setOnClickListener(new ImageView.OnClickListener() {

                    @Override
                    public void onClick(final View v) {
                        Log.d("POSITION****", String.valueOf(position));
                        final Integer index = (Integer) v.getTag();

                        holder.dataFields = items.get(position);
                        value = holder.dataFields.getId();

                        int status = dbHandler
                                .deleteField(holder.dataFields);

                        if (status != 0) {
                            items.remove(index.intValue());
                            notifyDataSetChanged(); //ListView is getting updated but not the position values of rows
                        } else {
                            Toast.makeText(getContext(),
                                    "Failed to delete !",
                                    Toast.LENGTH_SHORT).show();

                        }
                    }
                });

        convertView.setTag(holder);
    }

    else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.mName.setText(rowItems.getName());

    return convertView;
}

どんな種類の助けも大歓迎です。ありがとう !

編集済み

皆さんが言ったように、私は次の変更を行いましたが、それでも位置の値は更新されていません...

holder.dataFields = items.get(position);
DataFields obj = items.get(position);
value = holder.dataFields.getId();

int status = dbHandler.deleteField(holder.dataFields);
if (status != 0) {
    items.remove(index.intValue());
    HomeActivity.mAdapter.remove(obj); //I also tried items.remove(obj);
    HomeActivity.mAdapter.notifyDataSetChanged();
} else {
    Toast.makeText(getContext(), "Failed to delete !", Toast.LENGTH_SHORT).show();
}
4

5 に答える 5

1

削除部分を実行した後、を使用してアダプタに通知する必要がありますnotifyDataSetChanged()

アップデート

これは、ビューのタグをインデックスとして使用しているために発生していると思います。これにより、インデックスが変更されることはありません。getViewラベルの付いたメソッドによって提供されるインデックスを使用する必要がありますfinal int position

編集

EDITとして投稿したコードの代わりに次のコードを試すことができますか

int status = dbHandler.deleteField(items.get(position));
if (status != 0) {
    items.remove(position);
    notifyDataSetChanged();
} else {
    Toast.makeText(getContext(), "Failed to delete !", Toast.LENGTH_SHORT).show();
}
于 2013-02-12T11:50:35.997 に答える
0

アイテムを削除していることが原因である可能性がありますが、それはまだViewHolderにあるため、削除後にViewHolderDataFieldsを更新する必要があります。

于 2013-02-12T11:54:47.127 に答える
0

DataFieldsレコードを保持するクラスを作成しました。したがって、その配列リストまたはハッシュマップ(使用したものは何でも)からオブジェクトを削除し、リストからオブジェクトを削除した後、以下のコードを記述します。

adapter.notifyDataSetChanged();

ここで、アダプターはカスタムアダプターです。

編集

public class Contants extends Application
{
    public int xyz;
}

このxyzオブジェクトを使用したい場合は、単に書く必要があります、

((Contants) getApplicationContext()).xyz;
于 2013-02-12T11:52:14.753 に答える
0

これを試して:

//Using the position we can
Object obj = adapter.getItem(position);
adapter.remove(obj);
//Notify the adapter
adapter.notifyDataSetChanged();
于 2013-02-12T11:53:58.203 に答える
0

削除後にアダプタをリセットしてみてください。

list.remove(adapter.getSelectedIndex());
reloadList();


    /**
 * Fixes bug where the list doesn't update. Call instead of just calling 
 * notifyDataSetChanged. 
 */
private void reloadList(){
    adapter.notifyDataSetChanged();
    getListView().setAdapter(adapter);
}
于 2013-02-12T15:58:56.220 に答える