【问题标题】:Updating Listview from Aysntask through adapter.add not working通过adapter.add从Aysntask更新Listview不起作用
【发布时间】:2017-03-16 16:27:16
【问题描述】:

我知道已经有人问过类似的问题,但是似乎没有关于更新列表视图的明确答案。

我正在尝试使用 arrayadapter 通过异步任务更新 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
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/gradient_bg" />

【问题讨论】:

    标签: listview android-asynctask android-arrayadapter


    【解决方案1】:

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

    onProgressUpdate()onPostExecute() 中的add 之后添加adapter.notifydatasetchanged()

    【讨论】:

    • 谢谢。我错过了最后一个命令,但也发现了另一行弄乱了我的代码。我有一个 this.recreate();在同一方法内刷新屏幕。那是在填充列表视图后完全清除它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多