通过adapter.add从Aysntask更新Listview不起作用

时间:2017-03-16 16:27:17

标签: listview android-asynctask android-arrayadapter

我知道已经提出了类似的问题,但似乎并不是更新列表视图的明确答案。

我正在尝试使用arrayadapter通过asynctask更新UI中的Listview。

我尝试将值添加到适配器,但是,虽然没有给出错误,但它似乎不起作用,因为列表视图仍为空。

如果我直接在适配器中输入数组,它就可以工作。但我希望通过asynctask来做到这一点,以便将来发展。

不确定是否应通过以下进度更新或PostExecute进行。

这是代码。

public class MainActivity extends AppCompatActivity {

    ListView myList;
    ArrayAdapter adapter;
    private String[] names = {"Test1","Test2","Test3","Test4","Test5"};


    //MAIN METHOD TO START PROGRAM
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myList = (ListView) findViewById(R.id.listView);
        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>());
        myList.setAdapter(adapter);


        new MyTask().execute();
    }



    class MyTask extends AsyncTask<Void, String, String> {

        ArrayAdapter<String> adapter;


        @Override
        protected void onPreExecute() {
            System.out.println("PreExecute Method Triggered");
            adapter = (ArrayAdapter<String>)myList.getAdapter();
        }

        @Override
        protected String doInBackground(String... params) {

            for (String Name : names)
            {
                publishProgress(Name);                    
            }            
            return "Values added";
        }


        @Override
        protected void onProgressUpdate(String... values) {
            adapter.add(values[0]);
            System.out.println("OnProgress Method Triggered = " + values[0]);
        }


        @Override
        protected void onPostExecute(String result) {
            System.out.println("PostExecute Method Triggered" + result);
        }
    }

}

这是我的acivity_main.xml

中的listview
  <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/gradient_bg" />

1 个答案:

答案 0 :(得分:0)

您需要让适配器知道更新ListView,因为基础数据已更改。您需要致电notifydatasetchanged来执行此操作。请参阅ArrayAdapter的{​​{3}}。

adapter.notifydatasetchanged()之后addonProgressUpdate()中添加onPostExecute()