【问题标题】:Make ArrayList only show new data使 ArrayList 只显示新数据
【发布时间】:2012-09-23 17:55:45
【问题描述】:

我有一个显示来自 tumblr 帐户的图像的应用。在列表的底部有一个“加载更多”按钮,按下时会将 20 多个图像加载到列表中。由于它现在可以工作,该应用程序仅将新图像附加到列表中,因此按下按钮后会显示 40 张图像。我怎样才能使列表只包含新的 20 张图片?

我的代码如下所示:

public class Example extends Activity {

static ArrayList<Tumblr> tumblrs;
Context context = null;
ListView listView = null;
TextView footer;
int offset = 0;
ProgressDialog pDialog;
public boolean isNew = false;

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 += 2;

                // 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();

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

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

}
}

如有任何帮助,我们将不胜感激。

【问题讨论】:

  • 在添加新实例之前清除列表?
  • 顺便说一句:你不应该使用 "runOnUIThread" insinde "runInBackground" ...你可以发布中间结果。
  • 我只是在没有 runOnUIThread 的情况下尝试了它,没有它我无法让 l“加载更多”按钮工作。
  • 那是因为您在其中更改了一个 GUI 元素。您确实需要查看开发人员指南。您不应更改 doInBackground 中的 GUI 元素。有一种方法可以从 doInBackground 中发布结果,也有一种方法可以捕获这些结果。在那个捕手中,您可以更新您的 gui。见:developer.android.com/reference/android/os/AsyncTask.htmlpublishProgress()onProgressUpdate

标签: java android arraylist load


【解决方案1】:

只需像这样重新初始化列表(这会在您的 loadMoreListView#doInBackground 方法中添加一行)。

tumblrs = new ArrayList<Tumblr> ();
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);
         }
}

PS:你添加了太多不需要的代码。

【讨论】:

  • 当我尝试将tumblrs = ArrayList&gt;Tumblr&gt; (); 行添加到我的项目时给我一个错误“此令牌后预期的表达式”不是添加此行是我唯一应该做的吗?而且我知道有很多代码,我会尽快清理它。
  • tumblrs = new ArrayList ();
  • @Fansher 是的,对不起,我忘记了最重要的部分 - new 部分。
  • 嗯,第一次按下按钮时它工作,然后按钮不会响应。这有逻辑上的原因吗?
  • 不,它不会记录错误。按钮只是没有响应。这不像应用程序崩溃。
【解决方案2】:

使用

tumblrs.clear();

在你的 doInBackground() 方法中

【讨论】:

    【解决方案3】:

    它很简单,我通常在我的项目中使用它。

    只需在您的ArrayList 上调用clear() 方法,该方法将进入您的ArrayAdpater

    在你的ArrayList上调用clear()用新数据加载它之前,将清空你以前的数据,并用新的20个条目填充它。

    【讨论】:

      猜你喜欢
      • 2018-02-19
      • 2018-12-04
      • 2016-05-27
      • 2016-08-24
      • 2016-04-05
      • 2013-12-18
      • 2014-03-24
      • 2018-02-21
      • 2013-07-02
      相关资源
      最近更新 更多