2016-03-09 218 views
0

我对我的tabview片段Activity有一个RecyclerView。 iam使用arrayList来填充recyclerview上的项目。这些JSON数据通过排球库从URL中获取。Android RecyclerView不更新项目

这里是我的代码

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

回答

2

我并不认为你的代码的行每行,但我可以建议是重构这些代码像这里

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

称这种现象onCreateView的方法和一次取回后再次调用此这意味着结果里面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) 
+0

其workis !!谢谢。我认为在onCreate上设置适配器是个问题。再次感谢。 – san88

+0

@ san88我的荣幸! –

0

请从下面的地方删除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; 
     } 

让我知道这是否正常工作。如果它不请您发布适配器代码,以便我可以进一步调试。

0
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); 
    } 
0

你应该抽射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(); 
    } 
} 
0
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();