4

TextViewと各行に1つの削除ボタンを使用してListViewを作成しています。

リストにデータを入力するには、カスタムアダプター(ベースアダプターを拡張)とsqlitedbを使用してリストにマップします。

私の要件は、レコードを削除してリストを更新する必要がある行の削除ボタンをクリックすることです。

dbからレコードを削除することはできますが、デバイスをローテーションするか、アクティビティからアダプターの新しいインスタンスを割り当てるまで、リストが更新されません。

私は次の答えを試し ましたが、私の場合はうまくいきませんでした。この回答と私の場合の違いは、私がbaseAdapterを使用していて、彼がcursorAdapterを使用していることです。

 public class BookmarksPDFAdapter extends BaseAdapter { 

            public View getView(int position, View convertView, ViewGroup parent) {
            openDatabase();




            btnDelete.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {

                    deleteBookmark(getLocation(v));//getlocation(View) method returns which delete button clicked
                    notifyDataSetChanged();

                }
            });
        }
        closeDatabase();
        return convertView;
    }

私の活動は次のようになります

public class BookmarkActivity extends Activity {


@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub

    super.onCreate(savedInstanceState);
    setContentView(R.layout.bookmarks);
    btnEdit = (Button) findViewById(R.id.edit_bookmarks);
    btnAdd = (Button) findViewById(R.id.add_bookmarks);

    list = (ListView) findViewById(android.R.id.list);

    adapter = new BookmarksPDFAdapter(this);

    list.setAdapter(adapter);
}

ブックマーク.xml

<LinearLayout 
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="10.0" 
android:paddingTop="5dp">

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"

    android:padding="3dip"
    android:layout_alignParentLeft="true"
    android:weightSum="1.0" 
    android:layout_marginRight="5dip">

    <ImageView
        android:id="@+id/iconShow"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/delete_icon"
        android:visibility="invisible" 
        android:layout_weight="1.0"/>
</LinearLayout>

<TextView
    android:id="@+id/bookmark_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="6dp"
    android:layout_weight="7.0"
    android:gravity="center_horizontal|center_horizontal"
    android:lines="1"
    android:text="@+id/TextView01"
    android:textSize="24dp" />

<Button
    android:id="@+id/btnDelete"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="right"
    android:layout_weight="2.0"
    android:text="@string/btn_txt_delete"
    android:visibility="invisible" >
</Button>

listitem.xml

<LinearLayout 
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="10.0" 
android:paddingTop="5dp">

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"

    android:padding="3dip"
    android:layout_alignParentLeft="true"
    android:weightSum="1.0" 
    android:layout_marginRight="5dip">

    <ImageView
        android:id="@+id/iconShow"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/delete_icon"
        android:visibility="invisible" 
        android:layout_weight="1.0"/>
</LinearLayout>

<TextView
    android:id="@+id/bookmark_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="6dp"
    android:layout_weight="7.0"
    android:gravity="center_horizontal|center_horizontal"
    android:lines="1"
    android:text="@+id/TextView01"
    android:textSize="24dp" />

<Button
    android:id="@+id/btnDelete"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="right"
    android:layout_weight="2.0"
    android:text="@string/btn_txt_delete"
    android:visibility="invisible" >
</Button>

deleteBookmarkメソッド

void deleteBookmark(int wantedChild) {

    String bookmarkItem = getBookmarkItemText(wantedChild, true);
    datasource.open();
    int check = datasource.deleteBookmark(bookmarkItem);
    if (check == 1) {

        btnDelete = (Button) (viewList.get(wantedChild)
                .findViewById(R.id.btnDelete));

        btnDelete.setText(R.string.btn_txt_deleted);
        btnDelete.setEnabled(false);
    }

    datasource.close();
}

ここでは、データベースからレコードを削除し、削除ボタンのテキストを削除から削除に変更します

4

4 に答える 4

7
adapter.notifyDataSetChanged();

上記のメソッドを呼び出して、いつでもリスト ビューを更新できます。あなたの場合、データベースからレコードを削除した後に呼び出します。

于 2012-04-27T16:47:36.650 に答える
2

次のように呼び出してリストビューを更新します。

listview.invalidateViews();
于 2012-04-27T16:50:14.237 に答える
0
notifyDataSetChanged();

私のdeleteBookmarkメソッドは次のようになります

void deleteBookmark(int wantedChild,  String bookmarkItem) {

    openDatabase();
    int check = datasource.deleteBookmark(bookmarkItem);
    if(check==1)
    Toast.makeText(context, R.string.msg_bookmark_delete, ReaderConstants.TOAST_SHOWTIME).show();
    else
        Toast.makeText(context, R.string.msg_bookmark_delete_failed, ReaderConstants.TOAST_SHOWTIME).show();
    notifyDataSetChanged();
    closeDatabase();
}
于 2012-06-05T10:51:08.983 に答える
0

アダプター内で、データセットを更新するためのカスタムメソッドを設定し、変更を通知します

public void updateData(ArrayList<DataSet> d) {

        this.data = d;
        notifyDataSetChanged();
    }

次に、Activity 内でメソッドを呼び出します (私の場合、onResume メソッド内で呼び出しています)。

@Override
        public void onResume(){
            super.onResume();
                adapter.updateData(dataList);
        }
于 2019-08-05T00:47:31.077 に答える