android - 从 ActionBarActivity 更新 listView

标签 android listview android-actionbaractivity

我的 MainActivity 扩展了 ActionBarActivity,有一个 ListView,我想使用 notifyDataSetChanged() 重新加载它,但我不知道该怎么做。

到目前为止我的代码:

public class MainActivity extends ActionBarActivity {
    private JournalEntryDataSource datasource;
    private ListView listView = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        datasource = new JournalEntryDataSource(this);
        datasource.open();
        listView = (ListView) findViewById(R.id.list);
        List<JournalEntry> values = datasource.getAllJournalEntries();


        listView.setAdapter(new ArrayAdapter<JournalEntry>(this, R.layout.list_item, R.id.lugares, values));



        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> arg0, View v, int position, long id) {
                Log.i("app", "Deleting item number " + position);
                datasource.deleteJournalEntry((JournalEntry) listView.getAdapter().getItem(position));

                //I would like to do this here:  
                //ArrayAdapter<JournalEntry> adapter = (ArrayAdapter<JournalEntry>) getListAdapter();
                //adapter.notifyDataSetChanged(); 

            }
        });


    }

但是我在调​​用 adapter.notifyDatasetChanged() 时出错...

有什么建议吗?我一直在看类似的问题,到目前为止还没有运气...... --------编辑代码------------

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        datasource = new JournalEntryDataSource(this);
        datasource.open();
        listView = (ListView) findViewById(R.id.list);
        values = datasource.getAllJournalEntries();
        listView.setAdapter(new ArrayAdapter<JournalEntry>(this, R.layout.list_item, R.id.lugares, values));
        ArrayAdapter<JournalEntry> adapter = (ArrayAdapter<JournalEntry>) getListAdapter();
        // use the SimpleCursorAdapter to show the
        // elements in a ListView



        listView.setAdapter(new ArrayAdapter<JournalEntry>(this, R.layout.list_item, R.id.lugares, values));
        listView.setLongClickable(true);
        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) {
                Log.i("hola","borrando la posición "+position);
                JournalEntry removeMe = (JournalEntry)listView.getAdapter().getItem(position);
                values.remove(removeMe);
                datasource.deleteJournalEntry(removeMe);
                //adapter.notifyDataSetChanged();
                reloadMe();


                return true;
            }
        });

    }

    public void reloadMe(){
        //need to do this better... but meh.
        Intent intent = new Intent(this, MainActivity.class);
        this.startActivity(intent);
    }

    protected ListView getListView() {
        if (listView == null) {
            listView = (ListView) findViewById(android.R.id.list);
        }
        return listView;
    }

    protected void setListAdapter(ListAdapter adapter) {
        getListView().setAdapter(adapter);
    }

    protected ListAdapter getListAdapter() {
        ListAdapter adapter = getListView().getAdapter();
        if (adapter instanceof HeaderViewListAdapter) {
            return ((HeaderViewListAdapter)adapter).getWrappedAdapter();
        } else {
            return adapter;
        }
    }

最佳答案

更新代码的更新答案

您不应再次创建相同的 Activity ,而应选择使用新的值对象设置另一个新的适配器对象。

public void reloadMe(){
        //need to do this better... but meh.
        //Intent intent = new Intent(this, MainActivity.class);
        //this.startActivity(intent);
        listView.setAdapter(new ArrayAdapter<JournalEntry>(this, R.layout.list_item, R.id.lugares, values));
    }

也许,你正在从

中删除
datasource.deleteJournalEntry((JournalEntry) listView.getAdapter().getItem(position));

但是您没有将“数据源”设置为适配器的数据源。如果你仔细看,你确实设置了“值”列表对象-

listView.setAdapter(new ArrayAdapter<JournalEntry>(this, R.layout.list_item, R.id.lugares, values)); 

也许您可能还需要从值列表中删除。

关于android - 从 ActionBarActivity 更新 listView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28965161/

相关文章:

带有自定义适配器的 Android ListView - getChildAt() 返回 null

android - 更新 fragment 内的 ListView

android - configuration.setLocale(locale) 不适用于 AppCompatDelegate.setDefaultNightMode

android - 我应该为每个新请求创建新的 HttpClient 吗?

windows - 当后续列有图像时,列表控件将图像的空间添加到列 0

java - 如何设置ListView水平滚动?

java - 兼容性问题? ActionBarActivity 已弃用,取而代之的是新的 AppCompatActivity

android - 更改抽屉导航的图标

android - 如何删除默认工具栏菜单项并替换为不同的图标?

java - 进度对话框显示但没有进度条显示且消息未更新