【问题标题】:How to reset the ListView with the ArrayAdapter after fetching data获取数据后如何使用 ArrayAdapter 重置 ListView
【发布时间】:2012-03-10 15:14:46
【问题描述】:

我正在使用 ListAdapter 来填充 ListView,如下所示:

static final String[] PROBLEMS = new String[] {"one", "two", "three" };

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);        

    setListAdapter(new ArrayAdapter<String>(this, R.layout.my_problems, PROBLEMS));

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

之后,我通过 AsyncTask 调用远程调用我的服务器以获取该列表的更多数据,当我从服务器取回数据时,我不知道如何填充和重置 ListView。到目前为止,我有这样的事情:

    @Override
    protected void onPostExecute(String result) 
    {       
            // Unwrap the stuff from the JSON string                
            String problem_title = null;
            String problem_id = null;

            try
            {
                JSONArray obj = new JSONArray(result);
                JSONObject o = obj.getJSONObject(0);                    

                Log.d( "Title: " , "" + o.getString("problem_title") );       
                Log.d( "id: " , "" + o.getString("problem_id") );      

                problem_title = o.getString("problem_title");
                problem_id = o.getString("problem_id");
            }
            catch ( Exception e )
            {
            }

            // Now not sure what to do :)
            // How do I reset the list that I had set up above?
                }

我可以将结果转换为适当结构化的数据以重置列表,但不确定如何完成。有人可以帮忙吗? :)

【问题讨论】:

    标签: android android-listview android-asynctask android-adapter


    【解决方案1】:

    我就是这样用的,

        values = new ArrayList<String>();
        //put anything you want in values as start
        adapter = new ArrayAdapter<String>(this,R.layout.notification, values);
        setListAdapter(adapter);
    

    然后

        //change values array with your new data then update the adapter
        adapter.notifyDataSetChanged();
    

    那么listview的内容会在你执行这个函数的时候发生变化

    【讨论】:

    • 现在让我试试...我会告诉你结果如何:)
    • 啊好的,正在编译!谢谢!
    【解决方案2】:

    如果您只想更改数据集,则无需重新初始化适配器。试试下面的代码 -

    adapter.clear();
    for(int i = 0;i<categoriesArray.length;i++){
        adapter.add(categoriesArray[i]);
    } 
    

    之后,如果需要,您也可以将更改通知给适配器,尽管这不是必需的。

    adapter.notifyDataSetChanged();
    

    如果您的目标是 API 级别 11 或更高,您可以在适配器上使用 addAll() 方法。因为它更有效。

    adapter.clear();
    adapter.addAll(categoriesArray);
    

    【讨论】:

      【解决方案3】:
      adapter.notifyDataSetChanged();
      

      是执行此操作的好选择,但有时这无法满足我们的需要。在这种情况下,您可以再次 setadapter 并刷新您的列表视图。但这不是一个好的选择,因为它会再次生成整个列表视图,所以这会导致性能非常下降。而且您的应用会变慢。

      【讨论】:

        猜你喜欢
        • 2017-11-04
        • 2019-02-26
        • 2018-01-14
        • 2013-08-24
        • 1970-01-01
        • 2011-10-13
        • 2013-08-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多