如何在获取数据后使用ArrayAdapter重置ListView

Gee*_*Out 7 android android-listview android-adapter android-asynctask

我正在使用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);
Run Code Online (Sandbox Code Playgroud)

之后,我正在远程调用我的服务器,通过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?
                }
Run Code Online (Sandbox Code Playgroud)

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

Hes*_*eed 16

我用这种方式,

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

然后

    //change values array with your new data then update the adapter
    adapter.notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)

然后列表视图内容将在您执行此功能时更改


noo*_*oob 8

如果您只想更改数据集,则无需重新初始化适配器.请尝试以下代码 -

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

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

adapter.notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)

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

adapter.clear();
adapter.addAll(categoriesArray);
Run Code Online (Sandbox Code Playgroud)