android如何为ArrayList设置notifySetDataChanged()

时间:2016-02-05 17:40:40

标签: android listview arraylist adapter

当我从其他活动返回活动时,我尝试刷新ListView内容。当我进一步返回主应用程序屏幕并返回时,它只刷新内容。

这是我的活动,其中我设置了ListView及其适配器:

public static final String ID = "Id";
public static final String iidd = "iidd";
private static final String DESC = "Description";

private AppCompatDelegate delegate;
Cursor c;
ListView listFood;
SimpleAdapter myAdapter;
ArrayList<Map<String, String>> names = new ArrayList<Map<String, String>>();
Integer i_d;
Integer iddd;

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

    listFood = (ListView) findViewById(R.id.listViewF);
    listFood.setOnItemClickListener(viewFoodListener);

    // database read
    DatabaseConnectorFood db = new DatabaseConnectorFood(this);
    db.open();
    c = db.getFoodData();

    while(c.moveToNext()) {
        Map<String, String> data = new HashMap<String, String>(2);
        data.put("Description", c.getString(c.getColumnIndex("Description")));
        data.put("Serving_Size", c.getString(c.getColumnIndex("Serving_Size")));
        names.add(data);
    }
    db.close();

    myAdapter = new SimpleAdapter(this, names, R.layout.list_food,
            new String[] {"Description", "Serving_Size"},
            new int[] {R.id.ViewFoodNotesOne, R.id.ViewFoodNotesTwo});

    listFood.setAdapter(myAdapter);
}

我尝试在onResume()下添加它,但它不起作用

@Override
protected void onResume() {
    super.onResume();

    myAdapter.notifyDataSetChanged();
}

编辑:我按照以下答案的建议执行了以下操作,但没有结果:

@Override
protected void onResume() {
    super.onResume();

    DatabaseConnectorFood db = new DatabaseConnectorFood(this);
    db.open();
    c = db.getFoodData();

    while(c.moveToNext()) {
        Map<String, String> data = new HashMap<String, String>(2);
        data.put("Description", c.getString(c.getColumnIndex("Description")));
        data.put("Serving_Size", c.getString(c.getColumnIndex("Serving_Size")));
        names.add(data);
    }
    db.close();

    myAdapter = new SimpleAdapter(this, names, R.layout.list_food,
            new String[] {"Description", "Serving_Size"},
            new int[] {R.id.ViewFoodNotesOne, R.id.ViewFoodNotesTwo});

    // Set the Adapter into SimpleCursorAdapter
    listFood.setAdapter(myAdapter);

    myAdapter.notifyDataSetChanged();
}

已解决:将names.clear();添加到此处的代码上方,首先将ListView清除为@Rami建议,然后才有效!感谢

4 个答案:

答案 0 :(得分:1)

adapter.notifyDataSetChanged()用于告诉ListView数据集中的项已更改。

您需要修改实际数据集才能获得任何视觉效果,因为只需调用该方法,就会在调用方法之前和之后显示相同的值。

如果您想保留此方法,则需要在onResume再次查询数据库以重新加载数据。 然后致电adapter.notifyDataSetChanged()

答案 1 :(得分:1)

当你回到onBackPressed()时,

onCreate没有被调用;你需要在onResume()方法

中将所有设置数据的logick放到适配器上

答案 2 :(得分:1)

1)要刷新列表,您需要清除数据(names),然后从数据库中重新加载。

2)经常调用onResume()方法。为了获得更好的性能,我建议您在使用子活动更新数据时使用onActivityResult()

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     // refresh your list here.

}

在这种情况下,请不要忘记使用startActivityForResult()代替startActivity()

答案 3 :(得分:0)

我建议使用SimpleCursorAdapter代替SimpleAdapter。当数据库中的数据发生变化时,它将为您处理所有细节。