【问题标题】:Confusion with ListView adapters与 ListView 适配器混淆
【发布时间】:2011-12-09 15:41:05
【问题描述】:

我在理解如何更新我的 ListView 时遇到了一些麻烦。当用户单击列表项时,该项目将从数据库中删除,并且 ListView 应该更新以不再显示它。但是,列表没有更新,我不确定我做得对。

这是我的代码:

package com.typhoon2099.mediacatalogue;

import android.os.Bundle;
import android.app.ListActivity;
import android.database.Cursor;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

    public class DVDs extends ListActivity {
    private DatabaseHelper database;
    private static final String MEDIA_TYPE = "DVD";
    private Cursor ListCursor;
    private BaseAdapter adapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        database = new DatabaseHelper(this);
        database.open();

        ListCursor = database.selectMedia(MEDIA_TYPE);
        database.close();
        startManagingCursor(ListCursor);

        adapter = new SimpleCursorAdapter(this,
            R.layout.listlayout,
            ListCursor,
            new String[] {DatabaseHelper.TABLE_NAME+".title", DatabaseHelper.TABLE_NAME+".author"},
            new int[] {R.id.text1, R.id.text2});
        setListAdapter(adapter);

        ListView lv = getListView();
        lv.setTextFilterEnabled(true);

        lv.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {
                database.open();
                database.deleteMedia(String.valueOf(id));
                ListCursor = database.selectMedia(MEDIA_TYPE);
                adapter.notifyDataSetChanged();
                setListAdapter(adapter);
                database.close();
            }
        });
    }
}

我知道数据库会正确更新,因为当您退出并重新进入应用程序时,列表会按原样显示,只是在删除项目时它不会更新。

【问题讨论】:

    标签: java android listview cursor


    【解决方案1】:

    在您的适配器上调用 notifyDataSetChanged()

    【讨论】:

    • adapter.notifyDataSetChanged();?更新光标后就已经存在了。
    • 为什么使用 setListAdapter(adapter);在 onitemclicklistner 中?
    • 因为我不确定如何更新列表,并认为这可能会导致列表重新加载或其他原因。
    【解决方案2】:

    这种变体有效吗?

    lv.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                database.open();
                database.deleteMedia(String.valueOf(id));
                database.close();
                adapter.notifyDataSetChanged(); // maybe use notifyDataSetInvalidated()
            }
        });
    

    【讨论】:

      猜你喜欢
      • 2016-01-14
      • 2021-06-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-28
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多