【问题标题】:GridView not updating its child views after adapter gets new items适配器获取新项目后,GridView 不更新其子视图
【发布时间】:2016-12-24 11:23:24
【问题描述】:

我一直在四处寻找,试图找出我的代码导致问题的原因。我有一个 GridView,它有一个 ArrayAdapter,它使用 AsyncTask 拉下照片。我可以看到正在更新的项目,但是当我尝试更新适配器时,GridView 似乎没有更新为新视图。

这是完成工作的相关代码...

private void fetchJsonResponse(String url) {
    // Pass second argument as "null" for GET requests
    JsonObjectRequest req = new JsonObjectRequest(Request.Method.GET,
            url + "&api_key=" + API_KEY,
            null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    try {
                        JSONArray photos = response.getJSONArray("photos");

                        for(int i = 0; i < photos.length(); i++){
                            JSONObject object = photos.getJSONObject(i);
                            String url = object.getString("img_src");
                            //String id = object.getString("id");
                            list.add(new ImageItem(null, "Picture", url));
                            Log.i("Debug 2", url);
                        }
                        Log.i("Debug 2", list.get(0).toString());

                        if(gridViewAdapter != null){
                            gridViewAdapter.clear();
                            gridViewAdapter.addAll(list);
                            gridViewAdapter.notifyDataSetChanged();
                            gridView.invalidateViews();
                        } else {
                            gridViewAdapter = new GridViewAdapter(getActivity(), R.layout.gridview_item, list);
                            gridView.setAdapter(gridViewAdapter);
                        }




                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.e("Error: ", error.getMessage());
        }
    });



    /* Add your Requests to the RequestQueue to execute */
    mRequestQueue.add(req);

}

private class MyAsyncTask extends AsyncTask<String, Void, Void> {
    private ProgressDialog progressDialog;
    private Context context;

    public MyAsyncTask (Context context){
        this.context = context;
        progressDialog = new ProgressDialog(getActivity());
        progressDialog.setMessage("Contacting Rover...");
    }

    @Override
    protected Void doInBackground(String... strings) {
        fetchJsonResponse(strings[0]);
        return null;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        Toast.makeText(getActivity(), "In Pre Execute", Toast.LENGTH_SHORT).show();
        progressDialog.show();

    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        progressDialog.dismiss();
    }
}

如果可能的话,我非常感谢任何帮助。试图在新年前推出应用程序:)。

也许如果你能告诉我为什么会这样,它就不会再次引起问题,其他人会看到。

编辑:添加了更多代码,在我单击按钮两次后刷新。

private void fetchJsonResponse(String url) {
    // Pass second argument as "null" for GET requests
    JsonObjectRequest req = new JsonObjectRequest(Request.Method.GET,
            url + "&api_key=" + API_KEY,
            null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    try {
                        JSONArray photos = response.getJSONArray("photos");
                        list.clear();
                        for(int i = 0; i < photos.length(); i++){
                            JSONObject object = photos.getJSONObject(i);
                            String url = object.getString("img_src");
                            list.add(new ImageItem(null, "Picture", url));
                            Log.i("Debug 2", url);
                        }
                        Log.i("Debug 2", list.get(0).toString());

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.e("Error: ", error.getMessage());
        }
    });



    /* Add your Requests to the RequestQueue to execute */
    mRequestQueue.add(req);

}

private class MyAsyncTask extends AsyncTask<String, Void, Void> {
    private ProgressDialog progressDialog;
    private Context context;

    public MyAsyncTask (Context context){
        this.context = context;

        progressDialog = new ProgressDialog(getActivity());
        progressDialog.setMessage("Contacting Rover...");
        pictureAdapter = new PictureAdapter(getActivity(), list);
        gridView.setAdapter(pictureAdapter);
    }

    @Override
    protected Void doInBackground(String... strings) {
        fetchJsonResponse(strings[0]);
        return null;
    }

    @Override
    protected void onPreExecute() {
        progressDialog.show();
        super.onPreExecute();
        Toast.makeText(getActivity(), "In Pre Execute", Toast.LENGTH_SHORT).show();


    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);

        pictureAdapter.updateItemList(list);
        gridView.invalidate();

        progressDialog.dismiss();
    }
}

适配器:

public class PictureAdapter extends BaseAdapter {
private ArrayList<ImageItem> items;
private Context context;
private TextView titleText;
private ImageView itemImage;

public PictureAdapter(Context context, ArrayList<ImageItem> items){
    this.context = context;
    this.items = items;
}

@Override
public int getCount() {
    return items.size();
}

@Override
public Object getItem(int position) {
    return items.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = LayoutInflater.from(context).inflate(R.layout.gridview_item, parent, false);

    titleText = (TextView) v.findViewById(R.id.text);
    itemImage = (ImageView)v.findViewById(R.id.image);

    titleText.setText(items.get(position).getTitle());
    Picasso.with(context).load(items.get(position).getUrl()).fit().into(itemImage);

    return v;
}

public void updateItemList(ArrayList<ImageItem> newItemList){
    this.items = newItemList;
    notifyDataSetChanged();
}

}

【问题讨论】:

  • 您是否遇到任何错误?虽然我不确定,但似乎你正在尝试调用适配器和非 ui 线程上的视图。 responseListener 执行什么线程?
  • @Redman 谢谢!我会看看那个,看看我是否可以使用 ViewHolder。什么都有帮助!没有错误,我什至看到图片网址进来了,所以显示它们在那里。我假设它在后台线程上执行。它在 AsyncTask 中被调用,它也在后台工作,虽然不是?非常感谢您的帮助!
  • 如果您在活动中进行操作,请在 runOnUiThread() 方法中更新您的 gridview 或使用将在 ui 线程上运行的处理程序
  • 我选择了 if/else 部分,它应该更新 GridView 并放入 onPostExecute,因为它在 UI 线程上运行,但现在似乎根本没有更新......

标签: android gridview android-arrayadapter


【解决方案1】:

在执行后尝试以下行

@Override
protected void onPostExecute(Void aVoid) {
    super.onPostExecute(aVoid);

    pictureAdapter.updateItemList(list,gridView);
    progressDialog.dismiss();
}

现在在你的 updateItemList 中

public void updateItemList(ArrayList<ImageItem> newItemList,GridView gridView){
    this.items = newItemList;

    gridView.setAdapter(null);
    gridView.invalidateViews();
    gridView.deferNotifyDataSetChanged();

    gridView.setAdapter(list);

}

【讨论】:

    【解决方案2】:

    为什么你从AsyncTask 调用Volley 请求作为VolleyNetworkThread 上执行请求。

    去掉AsyncTask,直接调用Volley

    试试这个。希望对您有所帮助。

    private ProgressDialog progressDialog;
    
    protected void onCreate(Bundle savedInstanceState) {
        progressDialog = new ProgressDialog(getActivity());
        progressDialog.setMessage("Contacting Rover...");
        progressDialog.show();
        fetchJsonResponse(url); 
    }
    
    private void fetchJsonResponse(String url) {
        // Pass second argument as "null" for GET requests
        JsonObjectRequest req = new JsonObjectRequest(Request.Method.GET,
                url + "&api_key=" + API_KEY,
                null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        progressDialog.dismiss();
                        try {
                            JSONArray photos = response.getJSONArray("photos");
                            list.clear();
                            for(int i = 0; i < photos.length(); i++){
                                JSONObject object = photos.getJSONObject(i);
                                String url = object.getString("img_src");
                                list.add(new ImageItem(null, "Picture", url));
                                Log.i("Debug 2", url);
                            }
                            pictureAdapter.notifyDataSetChanged();
                            Log.i("Debug 2", list.get(0).toString());
    
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                }, 
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        progressDialog.dismiss();
                        VolleyLog.e("Error: ", error.getMessage());
                    }
                });
        /* Add your Requests to the RequestQueue to execute */
        mRequestQueue.add(req);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多