2015-08-24 6 views
0

Я хочу показать список сообщений, загруженных в ресайклере, но просмотр recycler не показывает ничего. Я использую библиотеку ButterKnife для привязки представлений и андроидной асинхронной библиотеки для получения данных.notifyDatasetChanged() не работает в RecyclerView

Когда я использовал тот же код без использования какого-либо из этих библиотек код работает без каких-либо проблем (с использованием задачи асинхронной)

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     mRootView = inflater.inflate(R.layout.fragment_post_list, container, false); 
     ButterKnife.bind(this, mRootView); 

     //Initialize 
     init(); 

     //Set progress view 
     setProgress(); 

     //Get post list 
     get(); 
     return mRootView; 
    } 

private void init() { 
     mContentLoader.setVisibility(View.GONE); 
     mPostRecyclerView = (RecyclerView) mRootView.findViewById(R.id.mPostRecyclerView); 

     final LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity()); 
     mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
     mLayoutManager.scrollToPosition(0); 
     mPostRecyclerView.setLayoutManager(mLayoutManager); 

     mPostArrayList = new ArrayList<>(); 
     mPostRecyclerAdapter = new PostRecyclerAdapter(getActivity(), mPostArrayList); 
     mPostRecyclerView.setAdapter(mPostRecyclerAdapter); 

    } 

private void get() { 
     //Request parameters 
     RequestParams params = new RequestParams(); 
     params.put("key", API_KEY); 
     params.put("prettyPrint", "false"); 
     params.put("view", "reader"); 
     params.put("fetchImages", "true"); 
     params.put("fields", "items(author/displayName,content,images,labels,replies(selfLink,totalItems),title,titleLink,updated,url),nextPageToken"); 

     BloggerRESTClient.get("/posts", params, new JsonHttpResponseHandler() { 

      @Override 
      public void onProgress(long bytesWritten, long totalSize) { 
       super.onProgress(bytesWritten, totalSize); 
       mLoaderProgress.setText((long) 100 * bytesWritten/totalSize + "% Loading Posts"); 
      } 

      @Override 
      public void onSuccess(int statusCode, Header[] headers, JSONObject response) { 
       try { 
        //Get and update nextPageToken 
        if (response.has("nextPageToken")) 
         mNextPageToken = response.getString("nextPageToken"); 

        //Get posts 
        if (response.has("items")) { 
         JSONArray itemsArray = response.getJSONArray("items"); 
         for (int i = 0; i < itemsArray.length(); i++) { 
          JSONObject itemsObject = itemsArray.getJSONObject(i); 
          Posts posts = new Posts(itemsObject); 
          mPostArrayList.add(i, posts); 
         } 
         Log.d("size", "" + mPostArrayList.size()); 
         mPostRecyclerAdapter.notifyDataSetChanged(); 
         setSlider(); 
         mProgressView.setVisibility(View.GONE); 
         mContentLoader.setVisibility(View.VISIBLE); 
        } else { 
         Toast.makeText(getActivity(), "No Posts to Show!", Toast.LENGTH_LONG).show(); 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 

      @Override 
      public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) { 
       super.onFailure(statusCode, headers, responseString, throwable); 

       //Show error status on failure 
       Toast.makeText(getActivity(), "Error: HTTP " + statusCode, Toast.LENGTH_LONG).show(); 
      } 
     }); 
    } 

ответ

0

первым добавить свой товар в mPostArrayList, а затем использовать:

mAdapter.notifyItemInserted(mPostArrayList.size()-1) 

это лучше, чем использование

mAdapter.notifyDataChanged() 

в исполнении.

+0

Я сделал то же самое, сначала mPostArrayList.add (i, posts); а затем notifyDatasetChanged()? Или я делаю это неправильно? – Darpan

+0

попробуйте 'notifyDataChanged()' вместо 'notifyDatasetChanged()' или использовать 'notifyItemInserted()' –

+0

@Darpan мой ответ сработал? –

0

Похоже на логическую ошибку: он заменит исходные сообщения.

JSONArray itemsArray = response.getJSONArray("items"); 
         for (int i = 0; i < itemsArray.length(); i++) { 
          JSONObject itemsObject = itemsArray.getJSONObject(i); 
          Posts posts = new Posts(itemsObject); 
          mPostArrayList.add(i, posts); 
         } 

Изменить его к этому:

JSONArray itemsArray = response.getJSONArray("items"); 
for(JSONObject itemsObject : itemsArray) { 
     Posts posts = new Posts(itemsObject); 
     mPostArrayList.add(posts); 
} 

Остальной код кажется нормально.

Смежные вопросы