【问题标题】:EndlessAdapter not updating with updates in Android CWAC-EndlessAdapterEndlessAdapter 未使用 Android CWAC-EndlessAdapter 中的更新进行更新
【发布时间】:2014-01-19 05:49:24
【问题描述】:

我很难理解endless adapter 的文档

我尝试按照 Commonsware 的这些快速步骤操作无济于事:How can I use a custom adapter with the cwac-endless adapter?

因此,首先,您需要让您的自定义适配器自行正常工作。 然后,您创建 EndlessAdapter 子类(使用您的 cacheInBackground() 等)的实现,包装您的自定义适配器 在您的 EndlessAdapter 子类的实例中,并将您的实例 您的 ListView 中的 EndlessAdapter 子类

我有三个 java 类。我的活动,我的常规适配器(在我尝试集成无限适配器之前工作),我有一个子类无限适配器。我确定我只是在做一些小事,导致它不能正确触发。我的应用程序没有崩溃,它显示我的“正在加载”视图,它永远不会更新,并且之后似乎加载了很多东西,因为 gui 真的变慢了。我可能陷入了某种循环。有什么想法吗?

我的主要活动:

package com.eghdk.myapp.gui;

import java.util.ArrayList;

import android.annotation.TargetApi;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.NavUtils;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ListView;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.koushikdutta.async.future.FutureCallback;
import com.koushikdutta.ion.Ion;
import com.eghdk.myapp.R;
import com.eghdk.myapp.adapters.MyAdapter;
import com.eghdk.myapp.adapters.MyEndlessAdapter;
import com.eghdk.myapp.util.AppUtil;

public class MyBlog extends ListActivity {
    String content;
    String Url;
    String title;
    ArrayList<String> titles;
    ArrayList<String> urls;
    ArrayList<String> contents;

    MyAdapter adapter;
    int page = 1;
    int count = 20;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_blog);
        // Show the Up button in the action bar.
        setupActionBar();

        titles = new ArrayList<String>();
        urls = new ArrayList<String>();
        contents = new ArrayList<String>();

        adapter = new MyAdapter(this, titles);

        loadDataFromWeb(page, count);

        }
    }

    /**
     * Set up the {@link android.app.ActionBar}, if the API is available.
     */
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    private void setupActionBar() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            getActionBar().setDisplayHomeAsUpEnabled(true);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_my_blog, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            // This ID represents the Home or Up button. In the case of this
            // activity, the Up button is shown. Use NavUtils to allow users
            // to navigate up one level in the application structure. For
            // more details, see the Navigation pattern on Android Design:
            //
            // http://developer.android.com/design/patterns/navigation.html#up-vs-back
            //
            NavUtils.navigateUpFromSameTask(this);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public void loadDataFromWeb(int page, int count) {
//I'm using Koushs Ion library to do Async Json calls.
        Ion.with(
                MyBlog.this,
                "http://myblog.com/api/get_posts/?page=" + page + "&count="
                        + count).asJsonObject()
                .setCallback(new FutureCallback<JsonObject>() {
                    @Override
                    public void onCompleted(Exception e, JsonObject result) {

                        String status = result.getAsJsonPrimitive("status")
                                .getAsString();

                        if (!status.equals("ok")) {
                            Log.e("TAG", "api doesn't exist");
                            Log.e("TAG", "api doesn't");

                        } 

                        JsonArray jsonPostArray = result
                                .getAsJsonArray("posts");

                        for (JsonElement jsonElementPost : jsonPostArray) {

                            JsonObject jsonPost = jsonElementPost
                                    .getAsJsonObject();
                            int ID = jsonPost.get("id").getAsInt();
                            title = jsonPost.get("title").getAsString();
                            titles.add(title);
                            content = jsonPost.get("content").getAsString();
                            contents.add(content);


                                at = jsonPost.getAsJsonArray("attachments")
                                        .get(0).getAsJsonObject();
                                Url = at.get("url").getAsString();
                                urls.add(Url);

                        }

                        // Log.d("TAG", ID + "");
                        done();
                    }
                });

    }

    private void done() {
        MyEndlessAdapter endless = new MyEndlessAdapter(adapter, this);
        setListAdapter(endless);
    }

}

MyAdapter.java:

package com.eghdk.myapp.adapters;

import java.util.ArrayList;

import android.R;
import android.content.Context;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class MyAdapter extends BaseAdapter {
    ArrayList<String> titles;
    Context context;
    LayoutInflater mInflater;

    public MyAdapter(Context context, ArrayList<String> list) {
        titles = list;
        this.context = context;
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return titles.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        if (convertView == null) {
            convertView = mInflater.inflate(
                    android.R.layout.simple_list_item_1, parent, false);
        }
        ((TextView) convertView.findViewById(R.id.text1)).setText(Html
                .fromHtml(titles.get(position)));
        return convertView;
    }

}

无尽适配器:

package com.eghdk.myapp.adapters;

import java.util.ArrayList;

import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListAdapter;
import android.widget.TextView;

import com.commonsware.cwac.endless.EndlessAdapter;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.koushikdutta.async.future.FutureCallback;
import com.koushikdutta.ion.Ion;

公共类 MyEndlessAdapter 扩展 EndlessAdapter { ArrayList tempList = new ArrayList(); 受保护的字符串标题; 受保护的 ArrayList 标题; 受保护的字符串内容; 受保护的字符串 atUrl; ArrayAdapter 旧适配器; 整数页 = 1,计数 = 20; 上下文上下文;

public MyEndlessAdapter(ListAdapter wrapped, Context ctx) {
    super(wrapped);
    context = ctx;
    titles = new ArrayList<String>();
    oldadapter = (ArrayAdapter) wrapped;

    // TODO Auto-generated constructor stub
}

@Override
protected void appendCachedData() {
    // TODO Auto-generated method stub
    oldadapter.addAll(titles);

}

    @Override
    protected View getPendingView(ViewGroup parent) {
        // TODO Auto-generated method stub
        TextView view = new TextView(context);
        view.setText("LOADING");
        return view;
    }

    @Override
    protected boolean cacheInBackground() throws Exception {
        Ion.with(
                context,
                "http://myblog.com/api/get_posts/?page=" + page + "&count="
                        + count).asJsonObject()
                .setCallback(new FutureCallback<JsonObject>() {
                    @Override
                    public void onCompleted(Exception e, JsonObject result) {
                        if (result == null) {
                            Log.e("TAG", "server crash");
                            Log.e("TAG", " crash");
                        }

                        String status = result.getAsJsonPrimitive("status")
                                .getAsString();

                        if (!status.equals("ok")) {
                            Log.e("TAG", "api doesn't exist");
                            Log.e("TAG", "api doesn't");

                        } else {

                        }

                        JsonArray jsonPostArray = result
                                .getAsJsonArray("posts");
                        int i = 0;
                        for (JsonElement jsonElementPost : jsonPostArray) {
                            Log.d("", i + "");
                            i++;
                            JsonObject jsonPost = jsonElementPost
                                    .getAsJsonObject();
                            int ID = jsonPost.get("id").getAsInt();
                            String url = jsonPost.get("url").getAsString();
                            title = jsonPost.get("title").getAsString();
                            titles.add(title);
                            content = jsonPost.get("content").getAsString();

                            String date = jsonPost.get("date").getAsString();

                            try {
                                JsonObject cat = jsonPost
                                        .getAsJsonArray("categories").get(0)
                                        .getAsJsonObject();
                                String catTitle = cat.get("title")
                                        .getAsString();
                            } catch (Exception e2) {
                                // TODO Auto-generated catch block
                                e2.printStackTrace();
                            }

                            JsonObject author = jsonPost
                                    .getAsJsonObject("author");
                            String name = author.get("name").getAsString();
                            JsonObject at = null;
                            try {
                                at = jsonPost.getAsJsonArray("attachments")
                                        .get(0).getAsJsonObject();
                                atUrl = at.get("url").getAsString();
                                String atMime = at.get("mime_type")
                                        .getAsString();

                            } catch (Exception e1) {
                                // TODO Auto-generated catch block
                                e1.printStackTrace();
                                atUrl = "";

                            }

                        }

                        // Log.d("TAG", ID + "");
                        // done();
                    }
                });
        return true;
    }

}

【问题讨论】:

    标签: java android android-listview commonsware-cwac


    【解决方案1】:

    我确定我只是在做一些小事,导致无法正常触发。

    让我们回顾一下文档“使用”部分的主要标题:

    • Constructors:您正在调用 EndlessAdapter 子类的构造函数

    • Placeholder:你已经在你的EndlessAdapter子类上实现了getPendingView()

    • The Loading:你已经在你的EndlessAdapter子类上实现了cacheInBackground(),虽然你的实现很奇怪(三个ArrayList&lt;String&gt;而不是一个ArrayList&lt;WhateverYourActualModelObjectShouldBe&gt;?),它可能工作

    • The Attaching: BZZZT -- 你的appendCachedData() 没有做任何事情

    • The Threading:你的代码应该没问题,只要你不尝试同时使用其他AsyncTasks,或者你的android:targetSdkVersion小于13

    • The Overriding: 你的代码应该没问题

    因此,我建议您返回 The Attaching,通读该部分,然后查看演示应用程序的实现。尽管您的数据模型是数组,但您的数据模型可能更复杂,因为您选择使用 BaseAdapter 而不是 ArrayAdapter

    【讨论】:

    • 我要将我的数组更改为 ArrayAdapter。而且......多个异步任务的问题是什么?我正在尝试支持 10 岁及以上。
    • @EGHDK:我建议您返回并重新阅读The Threading,尤其是单击the link to the blog post that covers this issue,然后也许在我的Android 开发书籍中查找AsyncTask认为你有。 :-)
    • 当我将 ArrayAdapter 传递给 EndlessAdapter 时,如何将我的新 ArrayList 附加到适配器?
    • 编辑:在这里丢失:“获取 cacheInBackground() 缓存的数据并将其附加到您在构造函数中使用的 ListAdapter”
    • @EGHDK:好吧,如果它是ArrayAdapter,您将使用ArrayAdapter 上的方法,例如add()
    猜你喜欢
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多