Android:通过volley无法动态添加listview项

3

您好,我正在处理类似于 Tinder 的 CardSwipe 功能。(请参见附带的图像)

enter image description here

为此,我遵循了这个代码,当使用下面的静态数据时,我可以成功地将项目添加到ListView中:

private void loadCards2(){

        itemsaArrayList = new ArrayList<>();

        for(int i = 0; i < 10; i++){

            CardSwipeItems items = new CardSwipeItems();

            items.setCardImageUrl("http://i.ytimg.com/vi/PnxsTxV8y3g/maxresdefault.jpg");
            items.setCardDescription("But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness.");

            itemsaArrayList.add(items);
        }

        flingContainer = (SwipeFlingAdapterView) findViewById(R.id.frame);
        myAppAdapter = new CardSwipeAdapter(itemsaArrayList, CardSwipeActivity.this);
        flingContainer.setAdapter(myAppAdapter);

        initControlls();

    }

但是当我尝试使用Volley动态添加项时,这些项并没有添加到ListView中。(关于Volley,请参见CardSwipeActivity中的loadCards()方法)
我尝试了许多方法来动态加载列表视图中的项目。例如:我使用了Thread(有关代码,请参见此处),我还使用了Handler(有关代码,请参见此处),但我无法在ListView中动态添加项目。
如果有人知道解决方案,请告诉我。谢谢......
*My method*

private void loadCards(){

        String Url = "myApi";
        Log.e("Url", Url);

        final ProgressDialog dialog = ProgressDialog.show(CardSwipeActivity.this, null, null);
        ProgressBar spinner = new android.widget.ProgressBar(CardSwipeActivity.this, null,android.R.attr.progressBarStyle);
        spinner.getIndeterminateDrawable().setColorFilter(Color.parseColor("#009689"), android.graphics.PorterDuff.Mode.SRC_IN);
        dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
        dialog.setContentView(spinner);
        dialog.setCancelable(false);
        dialog.show();


        StringRequest request = new StringRequest(Request.Method.GET, Url, new Response.Listener<String>() {

            @Override
            public void onResponse(String response) {

                dialog.dismiss();

                if(response != null && !response.startsWith("<HTML>")){

                    Log.e("OnResponse", response);

                    try {
                        JSONArray jsonArray = new JSONArray(response);

                        if(jsonArray.length() > 0){

                            itemsaArrayList = new ArrayList<>();

                            for(int i = 0; i< jsonArray.length(); i++){

                                JSONObject singleObj = jsonArray.getJSONObject(i);

                                String imgId = singleObj.getString("avatar_file_id");
                                String name = singleObj.getString("name");

                                CardSwipeItems items = new CardSwipeItems();

                                Log.e("imgId", imgId);
                                Log.e("name", name);

                                items.setCardImageUrl(imgId);
                                items.setCardDescription(name);

                                itemsaArrayList.add(items);

                            }

                            flingContainer = (SwipeFlingAdapterView) findViewById(R.id.frame);
                            myAppAdapter = new CardSwipeAdapter(itemsaArrayList, CardSwipeActivity.this);
                            flingContainer.setAdapter(myAppAdapter);

                            initControlls();

                        }

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

                }else{

                    Log.e("Internet", "Internet");
                }

            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                dialog.dismiss();

                if(error != null){

                    Log.e("error", error.toString());
                }else{


                }
            }
        }){

            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String,String> params = new HashMap<String, String>();
                params.put("token","b32daf7b50c7f21dba80dd0651174e3839c22f56");
                params.put("user_id","386");

                Log.e("Headers", "**********Headers*************");
                Log.e("token","b32daf7b50c7f21dba80dd0651174e3839c22f56");
                Log.e("user_id","386");

                return params;
            }
        };

        RequestQueue queue = Volley.newRequestQueue(CardSwipeActivity.this);
        queue.add(request);
        queue.getCache().remove(Url);

    }

请将有问题的代码粘贴在此处。我们不应该下载您的项目。 - Vladyslav Matviienko
1
你尝试过在简单的Runnable类上使用runOnUiThread方法吗? - Ankur1994a
@Ankur1994a:是的,我也尝试过那个,但对于代码来说它不起作用,请查看此链接https://www.dropbox.com/s/lglhtzbrvr6fixq/CardSwipeActivity%20%28With%20thread%29.java。 - Bahu
你能获取到响应数据吗?你有调试代码来检查是否有异常或者数据未被获取吗? - Vickyexpert
请检查我的答案是否有效。 - Vickyexpert
显示剩余2条评论
2个回答

1
你可以通过向最初传递给适配器的列表中添加项目来动态添加项目,方法如下:
itemsaArrayList.add(items);

您需要在UI线程中这样通知适配器:
runOnUiThread(new Runnable() {
    public void run() {
        adapter.notifyDataSetChanged();
    }
});

如果要在UI线程上调用它,您需要使用Activity的runOnUiThread()。只有这样,notifyDataSetChanged()才能起作用。

还可以参考post


0
如果您从服务器收到响应,则尝试将下面的代码行从onResponse方法移动到onCreate方法中。
     flingContainer = (SwipeFlingAdapterView) findViewById(R.id.frame);

希望这个能够运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接