有关Android列表视图和ArrayAdapter的问题

时间:2011-04-25 02:53:57

标签: android listview arraylist android-arrayadapter

所以我在这里玩这个代码,主要目标是在点击按钮后用新项目更新列表。我的代码有效,但我不确定这是否是正确的方法。

我有两种方法。第一个方法接受我的ArrayList,添加两个字符串并将其发布到listview。大!

当我点击按钮时,我会调用第二种方法。它添加一个新的字符串并更新列表,但为了让我更新现有的listview,我不得不再次执行“setListAdapter(new ArrayAdapter ....”行,我不确定这是否正确做。

我可以使用一些输入,谢谢!

方法1:

static final List list = new ArrayList();
private void showEvents (Cursor cursor){
        list.add("foo");
        list.add("bar");
        Log.d(TAG,"showevent");
        setListAdapter(new ArrayAdapter<String>(this, R.layout.singleitem, list));



    }

方法2(当我点击listView下的按钮时调用此方法):

private void updateListView(){
        try{
            list.add("son");
            setListAdapter(new ArrayAdapter<String>(this, R.layout.singleitem, list));


        }catch (Exception e){
            Log.d(TAG, "E="+e);
        }
    }

2 个答案:

答案 0 :(得分:2)

不要再次设置列表适配器,而是调用ArrayAdapter上的notifyDataSetChanged()。上面的“工作”,但它强制整个ListView重绘,所以如果你有一个很长的列表,用户已经滚动它将弹出它们回到顶部。通知是一种更简洁的方法。

非常简单的代码。在这种情况下,我在活动中引用了数组适配器:

adapter.notifyDataSetChanged();

以下是基于您的代码的示例:

static final List list = new ArrayList();
ArrayAdapter adapter;

private void showEvents (Cursor cursor){
    list.add("foo");
    list.add("bar");
    Log.d(TAG,"showevent");

    adapter = new ArrayAdapter<String>(this, R.layout.singleitem, list)
    setListAdapter(adapter);
}

private void updateListView(){
    try{
        list.add("son");
        adapter.nofityDataSetChanged();
        // not needed anymore
        //setListAdapter(new ArrayAdapter<String>(this, R.layout.singleitem, list));
    }catch (Exception e){
        Log.d(TAG, "E="+e);
    }
}

答案 1 :(得分:0)

声明ArrayAdapter的成员变量(比如myAdapter),然后在showEvents方法中初始化它并将其设置为listView。将字符串添加到列表后,在updateListView方法中接下来只需调用myAdapter.notifyDataSetChanged();,这应该可以解决问题