2015-02-24 14 views
5

Tôi đã triển khai Recyclerview trong ứng dụng thử nghiệm của mình. Hiện tại tôi đang thu thập khoảng 5000 mục dữ liệu vào một mô hình và tải chế độ xem của tôi với danh sách này. Tất cả mọi thứ là tuyệt vời, và thực hiện độc đáo nhưng tôi không đặc biệt muốn tải tất cả 5000 mặt hàng. Tôi muốn tải 100 mục và sau khi người dùng chạm vào dưới cùng, tải 100 mục tiếp theo và về cơ bản biến nó thành một danh sách ngày càng phát triển.Tôi có một Recyclerview và một danh sách với 5000 mục nhưng tôi chỉ muốn tải 100 mục tại một thời điểm

Tôi có thể triển khai onScrollListener chống lại Recyclerview để phát hiện khi tôi đến cuối nhưng vấn đề của tôi (đơn giản như âm thanh này) là cách tốt nhất để nói cho Recyclerview chỉ tải 100 cho đến khi tôi Nói?

Adaptor của tôi:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { 

    private List<ImageFeed> mFeedList; 

    public MyAdapter(List<ImageFeed> feedList) { 
     this.mFeedList = feedList; 
    } 

    public void setFeedList(List<ImageFeed> feedList) { 
     mFeedList = feedList; 
    } 

    @Override 
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup vGroup, int i) { 
     View v = LayoutInflater.from(vGroup.getContext()).inflate(R.layout.recycler_list, vGroup, false); 
     return new MyAdapter.ViewHolder(v); 
    } 

    @Override 
    public void onBindViewHolder(final MyAdapter.ViewHolder viewHolder, int i) { 
     String mTitle = mFeedList.get(i).getTitle(); 

     ...//Do other stuff 
    } 

    @Override 
    public int getItemCount() { 
     return mFeedList.size(); 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

     protected ImageView mImageView; 
     protected TextView mTitle; 
     protected ProgressBar mLoader; 
     private int mItemId; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      this.mImageView = (ImageView) itemView.findViewById(R.id.imgItem); 
      this.mTitle = (TextView) itemView.findViewById(R.id.txtTitle); 
      this.mLoader = (ProgressBar) itemView.findViewById(R.id.mLoaderProgress); 

      this.mImageView.setOnClickListener(this); 
      itemView.setOnClickListener(this); 
     } 

     public void setItem(int item) { 
      this.mItemId = item; 
     } 

     @Override 
     public void onClick(View v) { 
      if (v instanceof ImageView) { 
       Toast.makeText(v.getContext(), "Image view clicked: " + this.mItemId, Toast.LENGTH_SHORT).show(); 
      } else { 
       Toast.makeText(v.getContext(), this.mItemId + " ", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 
} 

Suy nghĩ kịch bản ra tôi đã có thể nghĩ thông qua một danh sách nhỏ hơn là một khả năng nhưng nó không cảm thấy hoàn toàn đúng.

+0

có, nó thực sự là một mẫu * phổ biến *. Có lẽ bạn có thể bắt đầu tải trước nó khi bạn là x yếu tố xa phía dưới – Blackbelt

+0

Tôi có thể hiểu nhầm câu hỏi, nhưng điều này dường như không cụ thể đối với RecyclerView. Nếu bạn đã thực hiện công việc tải 5.000 mục, bạn đã thực hiện việc nâng hạng nặng. Nếu không, tôi nghĩ bạn đang đi đúng hướng bằng cách triển khai onScrollListener và chỉ cần tải các trang dữ liệu tiếp theo khi người dùng đến cuối trang. –

+0

Đó là một vấn đề phổ biến nhưng tôi không biết về một giải pháp phổ biến/đơn giản. Khái niệm bộ điều hợp tiêu chuẩn không có gì bao gồm mà sẽ cho bạn biết phần nào của mô hình sao lưu là bắt buộc hoặc hiện được hiển thị. Nó chỉ dành cho "thích nghi" từ dữ liệu * được nạp * tới các mục được hiển thị. Bạn có thể giải quyết ví dụ: bằng cách thực hiện tải tự động thông qua trình lắng nghe cuộn hoặc các mục đặc biệt khi được hiển thị (mục danh sách có nội dung "tải ..") tải lên, phân trang thủ công qua nút/vuốt/.. hoặc thậm chí bằng cách hiển thị các mục giả trong khi tải một cách ngẫu nhiên các mục thực tế (bộ tải hình ảnh làm điều đó). – zapl

Trả lời

6

Ok vì vậy đây không phải là đặc biệt khó khăn sau khi tất cả - Tôi nghĩ vấn đề chính của tôi đã được hơn suy nghĩ kịch bản ...

Vì vậy, điều đầu tiên tôi làm là lấy dữ liệu thích hợp (trong trường hợp này thông qua JSON) và lưu trữ nó trong một mảng JSON để thao tác sau - hiện tại tôi vẫn nhận được tập hợp đầy đủ (tức là 5000) nhưng điều đó dễ thay đổi.

Điều này được thực hiện thông qua AsyncTask với thanh tiến trình không xác định. Khi đã hoàn thành, tôi chỉ phân tích cú pháp JSON thành 20 phần tử và tải phần này vào bộ điều hợp.

Sau khi thực hiện tôi có Recyclerview.onScrollListener của tôi ....

mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { 

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

       mOnScreenItems = mRecyclerView.getChildCount(); 
       mTotalItemsInList = llm.getItemCount(); 
       mFirstVisibleItem = llm.findFirstVisibleItemPosition(); 

       if (mLoadingItems) { 
        if (mTotalItemsInList > mPreviousTotal) { 
         mLoadingItems = false; 
         mPreviousTotal = mTotalItemsInList; 
        } 
       } 

       if (!mLoadingItems && (mTotalItemsInList - mOnScreenItems) <= (mFirstVisibleItem + mVisibleThreshold)) { 
        new AsyncLoadTask().execute(); 
        mLoadingItems = true; 
       } 
      } 

      @Override 
      public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
       super.onScrollStateChanged(recyclerView, newState); 
      } 

     }); 

Khi nó gần kề cuối cùng hoặc chạm đáy một AsynTask mới được khởi công để tải mục bổ sung vào danh sách. onPostExecute() sau đó cập nhật bộ điều hợp thông qua phương pháp mMyAdapter.notifyDataSetChanged(); của nó dẫn đến một bản cập nhật mượt mà tốt đẹp. Rất nhiều việc phải làm nhưng những điều cơ bản là ở đó.

Cảm ơn những người chỉ đường!

+0

đẹp trai. Tuy nhiên tôi phải làm thêm một điều nữa. Thay vì sử dụng mMyAdapter.notifyDataSetChanged(); Tôi đã sử dụng mMyAdapter.notifyItemInserted (vị trí); Bằng cách này, bộ điều hợp sẽ không chiếm bộ nhớ cho các mục đã tải. – neaGaze

Các vấn đề liên quan