【问题标题】:Update list view through async task通过异步任务更新列表视图
【发布时间】:2014-12-30 11:17:53
【问题描述】:

我正在尝试制作一个通过获取请求检索数据并将其显示在列表视图中的应用程序。该请求是通过异步任务完成的。但是,异步任务无法更新列表。

public class MainActivity extends Activity {
    TextView getResponse;
    ArticleTeaserAdapter articleTeaserAdapter;
    private ArrayList<ArticleTeaser> articleTeasers = new ArrayList<ArticleTeaser>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getResponse = (TextView) findViewById(R.id.textView1);
        ListView listView = (ListView) findViewById(R.id.article_teasers_list);
        articleTeaserAdapter = new ArticleTeaserAdapter();
        new HttpAsyncTask().execute("http://content.url.com/search?api-key=test&page-size=5&order-by=newest");
    }

    private class HttpAsyncTask extends AsyncTask<String, Void, String> {
        protected String doInBackground(String... urls) {
            return GET(urls[0]);
        }

        protected void onPostExecute(String result) {
            String response = "";
            JSONObject jObject;
            try {
                jObject = new JSONObject(result);
                JSONObject jObject2 = jObject.getJSONObject("response");
                JSONArray jArray = jObject2.getJSONArray("results");
                for (int i = 0; i < jArray.length(); i++) {
                    Map<String,String> out = new HashMap<String, String>();
                    out = parse((JSONObject)jArray.get(i),out);
                    Iterator it = out .entrySet().iterator();
                    while (it.hasNext()) {
                        Map.Entry pairs = (Map.Entry)it.next();
                        if (pairs.getKey().equals("webTitle")) {

                            articleTeasers.add(new ArticleTeaser(pairs.getValue().toString()));
                        }
                        it.remove(); // avoids a ConcurrentModificationException
                    }
                }
                articleTeaserAdapter.notifyDataSetChanged();
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
   }

    public class ArticleTeaserAdapter extends BaseAdapter {
        public ArticleTeaserAdapter() {
            /*articleTeasers.add(new ArticleTeaser("Local news 2"));
            articleTeasers.add(new ArticleTeaser("Local news 3"));
            articleTeasers.add(new ArticleTeaser("Local news 4"));
            articleTeasers.add(new ArticleTeaser("Local news 5"));*/
        }
        @Override
        public int getCount() {
            return articleTeasers.size();
        }

        @Override
        public Object getItem(int arg0) {
            return articleTeasers.get(arg0);
        }

        @Override
        public long getItemId(int arg0) {
            return arg0;
        }

        @Override
        public View getView(int index, View view, ViewGroup parent) {
            if(view == null) {
                LayoutInflater inflater = LayoutInflater.from(parent.getContext());
                view = inflater.inflate(R.layout.article_teaser_list_item, parent, false);
            }
            ArticleTeaser articleTeaser = articleTeasers.get(index);
            TextView articleTeaserTextView = (TextView) view.findViewById(R.id.title_view);
            articleTeaserTextView.setText(articleTeaser.getTitle());
            return view;
        }
    }
}

当我尝试通过适配器的构造函数添加数据时,一切正常。问题是我使用异步任务时列表视图没有更新

【问题讨论】:

  • 你能解释一下这篇文章是什么吗TeaserAdapter = new ArticleTeaserAdapter();
  • 您尚未将您的列表与您的适配器关联
  • 尝试发布所有代码
  • 你在哪里setAdapter 到你的listView???
  • 不完整的问题,发布完整的问题以获得准确的答案

标签: java android asynchronous android-asynctask


【解决方案1】:

onPostExecute 中创建新适配器的实例并在其中添加数据,并仅在列表不为空时更新适配器,

           if (articleTeaserAdapter == null) {
                articleTeaserAdapter = new ArticleTeaserAdapter();
                setListAdapter(articleTeaserAdapter);
            } else {
                articleTeaserAdapter.notifyDataSetChanged();
            }

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多