notifyDataSetChanged();不爽

时间:2014-01-12 10:18:30

标签: java android sqlite

我希望每次按下搜索按钮并使用编辑文本中的字符串刷新列表视图,但列表不刷新。

这是我的MainActivity:

public class MainActivity extends ListActivity implements OnClickListener {
    private DataSource datasource;

    Button search;
    EditText searchEt;

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

        search = (Button) findViewById(R.id.bSearch);

        searchEt = (EditText) findViewById(R.id.etTextSearch);

        search.setOnClickListener(this);

        datasource = new DataSource(this);
        datasource.open();

        List<Recipe> values = datasource.getAllRecipe(Recipe.l);
        // List<Recipe> values = datasource.getAllRecipe();

        // use the SimpleCursorAdapter to show the
        // elements in a ListView
        ArrayAdapter<Recipe> adapter = new ArrayAdapter<Recipe>(this,
                android.R.layout.simple_list_item_1, values);
        setListAdapter(adapter);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        ArrayAdapter<Recipe> adapter = (ArrayAdapter<Recipe>) getListAdapter();
        Recipe title = null;
        switch (v.getId()) {

        case R.id.bSearch:
            try {
                String s = searchEt.getText().toString();
                Recipe.l = s;
                Log.i("1", Recipe.l + "");

            } catch (Exception e) {
                String error = e.toString();
                Dialog d = new Dialog(this);
                d.setTitle("Row Empty or ID not found");
                TextView tv = new TextView(this);
                tv.setText(error);
                d.setContentView(tv);
                d.show();
            }
            break;

        }
        adapter.notifyDataSetChanged();
    }

    @Override
    protected void onResume() {
        datasource.open();
        super.onResume();
    }

    @Override
    protected void onPause() {
        datasource.close();
        super.onPause();
    }
}

这是我DAO的方法:

public List<Recipe> getAllRecipe(String l) throws SQLException {
        List<Recipe> titles = new ArrayList<Recipe>();
        Cursor cursor = database.query(Helper.TABLE_RECIPES, allColumns,
                Helper.COLUMN_TAG + "='" + Recipe.l + "'", null, null, null, null);

        cursor.moveToFirst();
        while (!cursor.isAfterLast()) {
            Recipe title = cursorToRecipe(cursor);
            titles.add(title);
            cursor.moveToNext();
        }
        // make sure to close the cursor
        cursor.close();

        return titles;
    }

    private Recipe cursorToRecipe(Cursor cursor) {
        Recipe title = new Recipe();
        title.setId(cursor.getLong(0));
        title.setTitle(cursor.getString(1));
        return title;
    }

这是我的模特课:

public static String l = "chicken";

我的onclicklisteners正在工作,按钮正在工作..我检查了DDMS中的日志,变量l正在改变..唯一的问题是listview没有刷新。

2 个答案:

答案 0 :(得分:2)

您正在获得类强制转换异常,因为您将getAllRecipe()(它返回Recipe对象列表)类型转换为Recipe对象(不是Recipe对象列表)。尝试将其更改为

title = (List<Recipe>) datasource.getAllRecipe(Recipe.l);

对于你想要实现的目标,有一个更好的方法,但这应该让你继续前进。希望这会有所帮助。

答案 1 :(得分:1)

ListView没有刷新,因为您没有在ArrayAdapter方法中修改代码中任何位置onClick的内容数组。因此,当调用notifyDataSetChanged时,它使用相同的旧数组并显示相同的先前内容。 因此没有变化。

尝试在onClick中为适配器设置新阵列,然后再次呼叫notifyDataSetChanged。那应该可以解决你的问题。 :)