0

我已经查看了所有文档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中获取所有数据。我编写的查询一次收集所有数据。仍然以这种方式处理是否正确?MySQLphpSQL

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

最后,听起来我必须adapteronActivityCreated这样设置:

// 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[]) 的事情吗?如果它为空也没关系,因为收集数据实际上发生在适配器中,对吗?

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

4

1 回答 1

2

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

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

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

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

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

 

我不明白或看不到 DemoAdapter(items) 的构造函数

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

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

那取决于你。

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

再次,这取决于你。

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

于 2013-04-11T19:52:44.540 回答