2016-03-09 122 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();