繁体   English   中英

Android RecyclerView不更新项目

[英]Android RecyclerView not updating items

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

这是我的代码

            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(); 但仍然显示空白。 请我找出错误..

我没有逐行查看您的代码,但是我建议将这些代码重构为如下所示的方法

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

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

  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)

请从以下位置删除notifyDataSetChanged。

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

当您更改了适配器中的数据并希望适配器知道数据已更改时,应该调用notifyDataSetChanged。 因此,在这种情况下,您将称其为一些添加到结果数组列表中的数据。

因此,一旦您在makeJsonArrayRequest()调用中将数据添加到结果中

          mAdapter.notifyDataSetChanged(); 

在for循环之后。

另外,在适配器构造函数中,请确保不创建新的数组列表,并按以下方式重用结果。

      ArrayList<DataObject> results;

      MyRecyclerViewAdapter(results){
             this.results = results;
      }

让我知道这个是否奏效。 如果没有,请发布您的适配器代码,以便我进一步调试。

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);
        mAdapter.notifyItemInserted(i);
    }

您应该在凌空的onRequestFinished方法中通知DatasetChanged。

在MainActivity.java中

 RequestListener listener;
 listener = new RequestListener();
 volley_queue.addRequestFinishedListener(listener);

RequestListner类

 class RequestListener implements RequestQueue.RequestFinishedListener     {
    @Override
    public void onRequestFinished(Request request) {
         mAdapter.notifyDataSetChanged();
   }
}
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());
}
mAdapter.notifyDataSetChanged();
hidepDialog();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM