Android RecyclerView不更新项目 [英] Android RecyclerView not updating items

查看:113
本文介绍了Android RecyclerView不更新项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 RecyclerView 在我的tabview片段Activity上.我使用arrayList填充recyclerview上的项目.这些JSON数据是通过凌空库从此 URL 中获取的.

I have a RecyclerView on my tabview fragment Activity. iam using arrayList to fill items on the recyclerview. Those JSON data are taken from this URL through volley library.

这是我的代码

            public class EditorsChoiceFragment extends Fragment {
            private RecyclerView mRecyclerView;
            private RecyclerView.Adapter mAdapter;
            private RecyclerView.LayoutManager mLayoutManager;
            private static String LOG_TAG = "EditorsChoiceFragment";
            private String urlJsonArry = "http://checkthisphone.com/black.apps/get_apps/editor.php";
            private ProgressDialog pDialog;
            private String jsonResponse;
            private static String TAG = EditorsChoiceFragment.class.getSimpleName();

            private String appTitle;
            private String appDescription;

            private JSONArray appDetails=null;
            ArrayList<DataObject> results = new ArrayList<DataObject>();

            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


                View view = inflater.inflate(R.layout.editor_choice_layout, container, false);
                makeJsonArrayRequest();
                pDialog = new ProgressDialog(getContext());
                pDialog.setMessage("Please wait...");
                pDialog.setCancelable(false);
                mRecyclerView = (RecyclerView)view.findViewById(R.id.my_recycler_view);
                mRecyclerView.setHasFixedSize(true);
                mLayoutManager = new LinearLayoutManager(getContext());
                mRecyclerView.setLayoutManager(mLayoutManager);

              //  mAdapter.notifyDataSetChanged();
                makeJsonArrayRequest();
                mAdapter = new MyRecyclerViewAdapter(results);
                mAdapter.notifyDataSetChanged();
                mRecyclerView.setAdapter(mAdapter);
               mAdapter.notifyDataSetChanged();

                return view;

            }

            @Override
            public void onResume() {
                super.onResume();
              /*((MyRecyclerViewAdapter) mAdapter).setOnItemClickListener(new MyRecyclerViewAdapter
                        .MyClickListener() {
                    @Override
                    public void onItemClick(int position, View v) {
                        Log.i(LOG_TAG, " Clicked on Item " + position);
                    }
                });*/
            }



            private void makeJsonArrayRequest() {

        //       showpDialog();
                JsonArrayRequest req = new JsonArrayRequest(urlJsonArry,
                        new Response.Listener<JSONArray>() {
                            @Override
                            public void onResponse(JSONArray response) {
                                Log.d(TAG, response.toString());


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

                                        JSONObject person = (JSONObject) response.get(i);

                                        String title = person.getString("title");
                                        String description = person.getString("description");
                                        DataObject obj = new DataObject(title, description);
                                        results.add(i, obj);

                                    }


                                } catch (JSONException e) {
                                    e.printStackTrace();
                                    Toast.makeText(getContext(),
                                            "Error: " + e.getMessage(),
                                            Toast.LENGTH_LONG).show();
                                    Log.d(TAG, e.getMessage());
                                }

                                hidepDialog();
                            }


                        }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        VolleyLog.d(TAG, "Error: " + error.getMessage());
                        Toast.makeText(getContext(),
                                error.getMessage(), Toast.LENGTH_SHORT).show();
                        hidepDialog();
                    }
                });



                // Adding request to request queue
                AppController.getInstance().addToRequestQueue(req);


            }

            private void showpDialog() {
                if (!pDialog.isShowing())
                    pDialog.show();
            }

            private void hidepDialog() {
                if (pDialog.isShowing())
                    pDialog.dismiss();
            }




        }

日志文件指示数据正确发送,但是recyclerview未更新.我使用了.notifyDataSetChanged();,但它仍然显示为空白.请我找到错误.

Log file indicates data coming correctly but recyclerview is not updating. I have used .notifyDataSetChanged(); but still it shows blank. Please me to find the error..

推荐答案

我没有逐行查看您的代码,但我建议将这些代码重构为类似此处的方法

I didn't view your codes each line by line but what I can suggest is refactor these codes as a method like here

public void setAdapter(ArrayList<DataObject> results){
    mAdapter = new MyRecyclerViewAdapter(results);
    mRecyclerView.setAdapter(mAdapter);
    mAdapter.notifyDataSetChanged();
}

onCreateView中调用此函数,然后在检索结果后再次调用此函数,这意味着在onResponse方法内部,如此处

Call this in onCreateView once and again call this after retrieving the results that means inside onResponse method like here

  try {
        for (int i = 0; i < response.length(); i++) {
            JSONObject person = (JSONObject) response.get(i);
            String title = person.getString("title");
            String description = person.getString("description");
            DataObject obj = new DataObject(title, description);
            results.add(i, obj);
        }
      }
      catch (JSONException e) {
        e.printStackTrace();
        Toast.makeText(getContext(),
                "Error: " + e.getMessage(),
                Toast.LENGTH_LONG).show();
        Log.d(TAG, e.getMessage());
    }
  //Call method here
     setAdapter(results)

这篇关于Android RecyclerView不更新项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆