我正在制作一个显示来自Tumblr帐户的图像的应用。它会加载前20个项目,然后在底部有一个“加载更多”按钮。单击“加载更多”按钮时,我使用AsyncTask进行处理。我已经按照我的预期进行了设置,但是我无法将接下来的20张图像添加到列表中。我已经看到其他一些项目使用自定义的listAdapter类,但是我正在寻找一种更简单的方法。

这是我的代码:

public class Example extends Activity {

Context context = null;
ListView listView = null;
TextView footer;
int offset = 0;
ProgressDialog pDialog;

private String searchUrl = "http://api.tumblr.com/v2/blog/factsandchicks.com/posts?api_key=API_KEY&offset=0";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ArrayList<Tumblr> tumblrs;
    try {
        tumblrs = getTumblrs();
        listView = (ListView) findViewById(R.id.list);
        View v = getLayoutInflater().inflate(R.layout.footer_layout, null);
        footer = (TextView) v.findViewById(R.id.tvFoot);
        listView.addFooterView(v);
        listView.setAdapter(new UserItemAdapter(this, R.layout.listitem,
                tumblrs));

    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    }

    footer.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            new loadMoreListView().execute();
        }
    });

}

public class UserItemAdapter extends ArrayAdapter<Tumblr> {
    private ArrayList<Tumblr> tumblrs;

    public UserItemAdapter(Context context, int imageViewResourceId,
            ArrayList<Tumblr> tumblrs) {
        super(context, imageViewResourceId, tumblrs);
        this.tumblrs = tumblrs;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if (v == null) {

            LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.listitem, null);

        }

        Tumblr tumblr = tumblrs.get(position);
        if (tumblr != null) {

            ImageView image = (ImageView) v.findViewById(R.id.avatar);

            if (image != null) {
                image.setImageBitmap(getBitmap(tumblr.image_url));
            }
        }
        return v;
    }
}

public Bitmap getBitmap(String bitmapUrl) {
    try {
        URL url = new URL(bitmapUrl);
        return BitmapFactory.decodeStream(url.openConnection()
                .getInputStream());
    } catch (Exception ex) {
        return null;
    }
}

public ArrayList<Tumblr> getTumblrs() throws ClientProtocolException,
        IOException, JSONException {
    searchUrl = "http://api.tumblr.com/v2/blog/factsandchicks.com/posts?api_key=API_KEY&offset=0";

    ArrayList<Tumblr> tumblrs = new ArrayList<Tumblr>();

    HttpClient client = new DefaultHttpClient();
    HttpGet get = new HttpGet(searchUrl);

    ResponseHandler<String> responseHandler = new BasicResponseHandler();

    String responseBody = null;
    try {
        responseBody = client.execute(get, responseHandler);
    } catch (Exception ex) {
        ex.printStackTrace();
    }

    JSONObject jsonObject = new JSONObject(responseBody);

    JSONArray posts = jsonObject.getJSONObject("response").getJSONArray(
            "posts");
    for (int i = 0; i < posts.length(); i++) {
        JSONArray photos = posts.getJSONObject(i).getJSONArray("photos");
        for (int j = 0; j < photos.length(); j++) {
            JSONObject photo = photos.getJSONObject(j);
            String url = photo.getJSONArray("alt_sizes").getJSONObject(0)
                    .getString("url");

            Tumblr tumblr = new Tumblr(url);
            tumblrs.add(tumblr);
        }
    }
    return tumblrs;
}

public class Tumblr {

    public String image_url;

    public Tumblr(String url) {

        this.image_url = url;
    }
}

private class loadMoreListView extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        // Showing progress dialog before sending http request
        pDialog = new ProgressDialog(Example.this);
        pDialog.setMessage("Please wait..");
        pDialog.setIndeterminate(true);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    @Override
    protected Void doInBackground(Void... unused) {
        // TODO Auto-generated method stub
        runOnUiThread(new Runnable() {
            public void run() {
                // increment current page
                offset += 20;

                // Next page request

                searchUrl = "http://api.tumblr.com/v2/blog/factsandchicks.com/posts?api_key=API_KEY&offset="
                        + offset;



                HttpClient client = new DefaultHttpClient();
                HttpGet get = new HttpGet(searchUrl);

                ResponseHandler<String> responseHandler = new BasicResponseHandler();

                String responseBody = null;
                try {
                    responseBody = client.execute(get, responseHandler);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }

                JSONObject jsonObject;
                try {
                    jsonObject = new JSONObject(responseBody);

                    JSONArray posts = jsonObject.getJSONObject("response")
                            .getJSONArray("posts");
                    for (int i = 0; i < posts.length(); i++) {
                        JSONArray photos = posts.getJSONObject(i)
                                .getJSONArray("photos");
                        for (int j = 0; j < photos.length(); j++) {
                            JSONObject photo = photos.getJSONObject(j);
                            String url = photo.getJSONArray("alt_sizes")
                                    .getJSONObject(0).getString("url");

                            Tumblr tumblr = new Tumblr(url);
                            tumblrs.add(tumblr);

                        }
                    }

                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                // get listview current position - used to maintain scroll
                // position
                int currentPosition = listView.getFirstVisiblePosition();

                // Appending new data to tumblrs ArrayList


                // Setting new scroll position
                listView.setSelectionFromTop(currentPosition + 1, 0);

            }
        });

        return null;
    }

    protected void onPostExecute(Void unused) {
        pDialog.dismiss();
    }

}

 }


任何帮助表示赞赏!

最佳答案

public class Example extends Activity {

 Context context = null;
   ListView listView = null;
 TextView footer;
 int offset = 0;
 ProgressDialog pDialog;
 ArrayList<Tumblr> tumblrs;
private String searchUrl = "http://api.tumblr.com/v2/blog/factsandchicks.com/posts?   api_key=API_KEY&offset=0";

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try {
    tumblrs = getTumblrs();
    listView = (ListView) findViewById(R.id.list);
    View v = getLayoutInflater().inflate(R.layout.footer_layout, null);
    footer = (TextView) v.findViewById(R.id.tvFoot);
    listView.addFooterView(v);
    listView.setAdapter(new UserItemAdapter(this, R.layout.listitem));

} catch (ClientProtocolException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} catch (JSONException e) {
    e.printStackTrace();
}

footer.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        new loadMoreListView().execute();
    }
});



public class UserItemAdapter extends ArrayAdapter<Tumblr> {

public UserItemAdapter(Context context, int imageViewResourceId) {
    super(context, imageViewResourceId, tumblrs);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (v == null) {

        LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.listitem, null);

    }

    Tumblr tumblr = tumblrs.get(position);
    if (tumblr != null) {

        ImageView image = (ImageView) v.findViewById(R.id.avatar);

        if (image != null) {
            image.setImageBitmap(getBitmap(tumblr.image_url));
        }
    }
    return v;
}
}


public Bitmap getBitmap(String bitmapUrl) {
try {
    URL url = new URL(bitmapUrl);
    return BitmapFactory.decodeStream(url.openConnection()
            .getInputStream());
} catch (Exception ex) {
    return null;
}
}

 public ArrayList<Tumblr> getTumblrs() throws ClientProtocolException,
    IOException, JSONException {
searchUrl = "http://api.tumblr.com/v2/blog/factsandchicks.com/posts?api_key=API_KEY&offset=0";

ArrayList<Tumblr> tumblrs = new ArrayList<Tumblr>();

HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(searchUrl);

ResponseHandler<String> responseHandler = new BasicResponseHandler();

String responseBody = null;
try {
    responseBody = client.execute(get, responseHandler);
} catch (Exception ex) {
    ex.printStackTrace();
}

JSONObject jsonObject = new JSONObject(responseBody);

JSONArray posts = jsonObject.getJSONObject("response").getJSONArray(
        "posts");
for (int i = 0; i < posts.length(); i++) {
    JSONArray photos = posts.getJSONObject(i).getJSONArray("photos");
    for (int j = 0; j < photos.length(); j++) {
        JSONObject photo = photos.getJSONObject(j);
        String url = photo.getJSONArray("alt_sizes").getJSONObject(0)
                .getString("url");

        Tumblr tumblr = new Tumblr(url);
        tumblrs.add(tumblr);
    }
}
return tumblrs;
 }
 }

public class Tumblr {

public String image_url;

public Tumblr(String url) {

    this.image_url = url;
}
 }

 private class loadMoreListView extends AsyncTask<Void, Void, Void> {

@Override
protected void onPreExecute() {
    // Showing progress dialog before sending http request
    pDialog = new ProgressDialog(Example.this);
    pDialog.setMessage("Please wait..");
    pDialog.setIndeterminate(true);
    pDialog.setCancelable(false);
    pDialog.show();
}

@Override
protected Void doInBackground(Void... unused) {
    // TODO Auto-generated method stub
    runOnUiThread(new Runnable() {
        public void run() {
            // increment current page
            offset += 20;

            // Next page request

            searchUrl = "http://api.tumblr.com/v2/blog/factsandchicks.com/posts?     api_key=API_KEY&limit=2&offset="
                    + offset;



            HttpClient client = new DefaultHttpClient();
            HttpGet get = new HttpGet(searchUrl);

            ResponseHandler<String> responseHandler = new BasicResponseHandler();

            String responseBody = null;
            try {
                responseBody = client.execute(get, responseHandler);
            } catch (Exception ex) {
                ex.printStackTrace();
            }

            JSONObject jsonObject;
            try {
                jsonObject = new JSONObject(responseBody);

                JSONArray posts = jsonObject.getJSONObject("response")
                        .getJSONArray("posts");
                for (int i = 0; i < posts.length(); i++) {
                    JSONArray photos = posts.getJSONObject(i)
                            .getJSONArray("photos");
                    for (int j = 0; j < photos.length(); j++) {
                        JSONObject photo = photos.getJSONObject(j);
                        String url = photo.getJSONArray("alt_sizes")
                                .getJSONObject(0).getString("url");

                        Tumblr tumblr = new Tumblr(url);
                        tumblrs.add(tumblr);

                    }
                }

            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            // get listview current position - used to maintain scroll
            // position
            int currentPosition = listView.getFirstVisiblePosition();

            // Appending new data to tumblrs ArrayList


            // Setting new scroll position
            listView.setSelectionFromTop(currentPosition + 1, 0);

        }
    });

    return null;
}

protected void onPostExecute(Void unused) {
    pDialog.dismiss();
}

}


}

这就是我的建议。我已经将tumblrs列表的第一个声明从oncreate移到了活动类本身。我已经将asyctask类设为该活动的子类,这样您就不必将tumblrs作为参数传递给new UserItemAdapter()。我已经为您删除了该论点。对于this.tumblrs=tumnlrs,您将不再需要它。如果您在其他地方使用tumblrs,请引用在Activity类本身中声明的相同的tumblrs对象。您甚至可以使tumblrs为静态,如上面的答案所述。实际上,使其静态化是实现此目的的最佳方法。

07-26 02:51