【问题标题】:Implementing EndlessAdapter with AsyncTask Passing in Object[]用 AsyncTask 传入 Object[] 实现 EndlessAdapter
【发布时间】:2013-04-11 19:34:35
【问题描述】:

我已经查看了CWAC-endlessAdapter 的所有文档以及演示项目。我确实了解它是如何工作的,并且主要了解一切的去向。但是我有几个关于如何处理我现在正在做的事情的问题(我还没有找到任何可行的例子)。

这是我使用的典型AsyncTask(稍微整理了一下):

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


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

            ArrayList<NameValuePair> param = new ArrayList<NameValuePair>();
            param.add(new BasicNameValuePair("username", userName));

            HttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url_select);

            try {
                httpPost.setEntity(new UrlEncodedFormEntity(param));
                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();

            } catch (Exception e) {

            }
            try {
                BufferedReader br = new BufferedReader(
                        new InputStreamReader(is));
                StringBuilder sb = new StringBuilder();
                String line = "";
                while ((line = br.readLine()) != null) {
                    sb.append(line + "\n");
                }
                is.close();
                result = sb.toString();

            } catch (Exception e) {

            }
            return null;
    }

        protected void onPostExecute(Void v) {

            String review, newdate, item, rating, cat;
            try {
                JSONArray jArray = new JSONArray(result);
                JSONObject json_data = null;
                for (int i = 0; i < jArray.length(); i++) {
                    json_data = jArray.getJSONObject(i);
                    newdate = json_data.getString("date");
                    review = json_data.getString("review");
                    item = json_data.getString("item");
                    rating = json_data.getString("rating");
                    cat = json_data.getString("category");


                    reviews.add(review);
                    itemslist.add(item);
                    datelist.add(newdate);
                    ratings.add(rating);
                    cats.add(cat);

                }
            } 

            Profile[] p = new Profile[reviews.size()];
            int index = 0;

            for (String i : reviews) {
                p[index] = new Profile(reviews.get(index), datelist.get(index),
                        itemslist.get(index), ratings.get(index),
                        cats.get(index));
                index++;
            }

            if (getActivity() != null) {
                adapter = new ProfileAdapter(getActivity(), p);
                setListAdapter(adapter);
            }


        }
    }

在这个task 中,我通过phpMySQL 数据库中获取所有数据。我编写的SQL 查询一次收集所有数据。仍然这样处理是否正确?

另外,我在ListFragment 中的onCreateView 中调用此任务。但看起来任务需要在cacheInBackground() 中调用?

最后,听起来我必须像这样在onActivityCreated 中设置adapter

// from Example
if (adapter==null) {
    items=new ArrayList<Integer>();

    for (int i=0;i<25;i++) { items.add(i); }

    adapter=new DemoAdapter(items);
    adapter.setRunInBackground(false); 

}
setListAdapter(adapter); 

我不明白或看不到DemoAdapter(items) 的构造函数在哪里,并且基于我正在传递一个对象数组的事实,我会做类似 DemoAdapter(object[]) 的事情吗?如果它为null也没关系,因为收集数据实际上发生在适配器中,对吗?

最后一个相关注意事项是,我所有的适配器都在设置它们的 Fragment 之外的一个类中。

【问题讨论】:

    标签: android android-arrayadapter commonsware-cwac


    【解决方案1】:

    我编写的 SQL 查询一次收集所有数据。仍然这样处理是否正确?

    这取决于你。但是,这样做,您不需要EndlessAdapter,因为您已经拥有了所有数据。 EndlessAdapter 背后的要点是支持您不是“一次收集所有数据”,而是希望收集一部分数据,并仅在用户滚动很远时收集另一部分的情况够了。

    另外,我在 ListFragment 的 onCreateView 中调用此任务。但是好像任务需要在cacheInBackground()中调用?

    这取决于你。如果您想使用自己的 AsyncTask 随时调用,那很好。这在文档中有介绍:

    如果您希望 EndlessAdapter 不运行自己的 AsyncTask,请调用 setRunInBackground(false)。在此模式下,您的cacheInBackground() 方法将在主应用程序线程 上调用。由您自己安排在自己的后台线程上完成工作,然后在您希望适配器更新以反映新添加的数据时调用onDataReady()。请注意,appendCachedData() 不会在这种情况下使用。

     

    我不明白也不知道哪里有 DemoAdapter(items) 的构造函数

    没有,因为演示不需要一个。

    基于我传递一个对象数组的事实,我会做类似 DemoAdapter(object[]) 的事情吗?

    这取决于你。

    如果它为null也没关系,因为收集数据实际上发生在适配器中,对吗?

    再一次,这取决于你。

    但是,正如我之前指出的,由于您不需要EndlessAdapter,我建议您停止使用它。

    【讨论】:

    • 感谢您的快速回复。实际上,我确实需要这个适配器。我有很长的列表要分解,并希望在用户滚动时加载。所以这基本上意味着我必须一次只获得一定数量的行,例如“LIMIT 50”?
    • @KickingLettuce:是的,LIMITOFFSET,或等效的。基本上,您的数据库后端的 Web 服务接口需要支持“分页”结果(例如,“gimme page 3”)。
    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多