2017-06-11 11 views
0

私には問題があります。なぜ人は助けないのですか?私のアプリケーションでサーバーからのデータをAndroidのRecyclerViewにアップロードする方法

私は、負荷データを必要とrecyclerViewため怠惰ローダーを使用しています。
私はロード・データのコードの下に書く:私は自分のアプリケーションにsearchViewを使用する必要があります

newsPageRecyclerView.setOnScrollListener(new EndlessRecyclerOnScrollListener(layoutManager) { 
       @Override 
       public void onLoadMore(int current_page) { 
        NewsSendData sendData = new NewsSendData(); 
        sendData.setKey(""); 

        InterfaceApi api = ApiClient.getClient().create(InterfaceApi.class); 
        Call<NewsResponse> call = api.getMainNews(sendData); 

        call.enqueue(new Callback<NewsResponse>() { 
         @Override 
         public void onResponse(Call<NewsResponse> call, Response<NewsResponse> response) { 
          if (response.body().getData().getNewsDatum() != null) { 
           newsAdapter.addNewItem(response.body().getData().getNewsDatum()); 
           newsPageLoadLay.setVisibility(View.GONE); 
          } 
         } 

         @Override 
         public void onFailure(Call<NewsResponse> call, Throwable t) { 
         } 
        }); 
       } 
      }); 

、およびI:

private void loadNews() { 
    NewsSendData sendData = new NewsSendData(); 
    sendData.setKey(""); 

    newsPageImageProgress.show(); 

    InterfaceApi api = ApiClient.getClient().create(InterfaceApi.class); 
    Call<NewsResponse> call = api.getMainNews(sendData); 

    call.enqueue(new Callback<NewsResponse>() { 
     @Override 
     public void onResponse(Call<NewsResponse> call, Response<NewsResponse> response) { 
      if (response.body().getData().getNewsDatum() != null) { 
       newModel.clear(); 
       newModel.addAll(response.body().getData().getNewsDatum()); 
       newsAdapter.notifyDataSetChanged(); 
       newsPageRecyclerView.setAdapter(newsAdapter); 
      } 
     } 

     @Override 
     public void onFailure(Call<NewsResponse> call, Throwable t) { 
    }); 

そしてrecyclerViewために怠惰なローダーのコードの下に書きますユーザーがテキストを検索するときに、は前のデータを削除し、サーバーから新しいデータを表示するだけです(sの検索結果エバー)。

newsSearchView.setOnQueryTextListener(new MaterialSearchView.OnQueryTextListener() { 
      @Override 
      public boolean onQueryTextSubmit(final String query) { 

       NewsSendData sendData = new NewsSendData(); 
       sendData.setKey(query); 

       InterfaceApi api = ApiClient.getClient().create(InterfaceApi.class); 
       Call<NewsResponse> call = api.getMainNews(sendData); 

       call.enqueue(new Callback<NewsResponse>() { 
        @Override 
        public void onResponse(Call<NewsResponse> call, Response<NewsResponse> response) { 
         if (response.body().getData().getNewsDatum() != null) { 
          newModel.clear(); 
          newModel.addAll(response.body().getData().getNewsDatum()); 
          newsAdapter.notifyDataSetChanged(); 
          newsPageRecyclerView.setAdapter(newsAdapter); 
          newsPageImageProgress.hide(); 

          toolbarTitleTxt.setText(query); 
         } 
        } 

        @Override 
        public void onFailure(Call<NewsResponse> call, Throwable t) { 
       }); 

IはのonCreate()活性のに上記のコードを書く:検索結果の
は、このコードを使用することです。
上記のコードを使用する場合は、サーバーから多くのデータを表示してください。例えば

私はときに、検索テキストは、私にPOSTMAN中2つのデータを示すが、自分のアプリケーションで件のデータのこの2データトップを示し、この2つのデータの下に他のデータを示しています。

遅延ローダーコードを削除すると、私の問題は修正され、この2つのデータが表示されますが、遅延ローダーを追加するともう一度データが表示されます。

どうすればこのバグを修正できますか?助けてください

答えて

0

EndlessRecyclerOnScrollListenerコードを次のものに置き換えてください。

public abstract class EndlessRecyclerOnScrollListener extends RecyclerView.OnScrollListener { 
public static String TAG = EndlessRecyclerOnScrollListener.class.getSimpleName(); 
int firstVisibleItem, visibleItemCount, totalItemCount; 
private int previousTotal = 0; // The total number of items in the dataset after the last load 
private boolean loading = true; // True if we are still waiting for the last set of data to load. 
private int visibleThreshold = 4; // The minimum amount of items to have below your current scroll position before loading more. 
private int current_page = 1; 

private StaggeredGridLayoutManager mGridLayoutManager; 

public EndlessRecyclerOnScrollListener(StaggeredGridLayoutManager gridLayoutManager) { 
    this.mGridLayoutManager = gridLayoutManager; 
} 

@Override 
public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
    super.onScrolled(recyclerView, dx, dy); 

    visibleItemCount = recyclerView.getChildCount(); 
    totalItemCount = mGridLayoutManager.getItemCount(); 
    int[] items = new int[3]; 
    mGridLayoutManager.findFirstVisibleItemPositions(items); 
    firstVisibleItem = items[0]; 

    if (loading) { 
     if (totalItemCount > previousTotal) { 
      loading = false; 
      previousTotal = totalItemCount; 
     } 
    } 
    if (!loading && (totalItemCount - visibleItemCount) 
      <= (firstVisibleItem + visibleThreshold)) { 
     // End has been reached 

     // Do something 
     current_page++; 

     onLoadMore(current_page); 

     loading = true; 
    } 
} 

public abstract void onLoadMore(int current_page); 

}

関連する問題