RecyclerView.Adapter

8214 ワード

RecyclerViewは言うまでもなく、ListViewに代わる新しいコントロールです.そのアダプタは柔軟性にあります.
RecyclerViewのitemがクリックイベントをサポートし、最後にドロップダウンするとProgressBarがロードしていることを示し、より多くのデータをロードする必要があります.
1.クリックイベントの実装
まずインタフェースを定義します
public interface RecyclerViewClickListener {
    void onItemClick(View view,int position);
}

アダプタコンストラクション関数、Clickオブジェクトの転送を増やす
1  private RecyclerViewClickListener mClickListener;
2 
3 public PostListAdapter(RequestQueue rQueue, RecyclerViewClickListener clickListener) {
4 
5         this.mClickListener = clickListener;
6     }

ItemのHolderオブジェクトを作成する場合は、ClickオブジェクトをHolderのコンストラクション関数に渡します(以下、キーコードのみを保持します).
 @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
 NormalAnswerHolder holder = new NormalAnswerHolder(
                    LayoutInflater.from(parent.getContext()).inflate(R.layout.item_home, parent, false), mClickListener);
            return holder;

        }
    }

HolderクラスでのClickイベントの処理
 1     class NormalAnswerHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
 2         private RecyclerViewClickListener mClickListener;
 3         private TextView textViewName;
 4         private TextView textViewCount;
 5         private TextView textViewExcerpt;
 6 
 7         public NormalAnswerHolder(View view, RecyclerViewClickListener clickListener) {
 8             super(view);
 9             this.mClickListener = clickListener;
10             textViewName = (TextView) view.findViewById(R.id.tv_name);
11             textViewCount = (TextView) view.findViewById(R.id.tv_count);
12             textViewExcerpt = (TextView)view.findViewById(R.id.tv_excerpt);
13 
14             itemView.setOnClickListener(this);
15         }
16 
17 
18         /**
19          * Click event.
20          *
21          * @param v
22          */
23         @Override
24         public void onClick(View v) {
25             if (mClickListener != null) {
26                 mClickListener.onItemClick(v, getPosition());
27             }
28         }
29     }

注意:Holderクラスのコンストラクション関数でClickオブジェクトを取得した後、itemViewにクリックイベントを設定する必要があります.itemのsubviewに個別のクリックイベントを設定する必要がある場合は、対応するviewにクリックイベントを設定すればよい.
 
Clickイベントの呼び出し:
 1 mAdapter = new PostListAdapter(mQueue, new RecyclerViewClickListener() {
 2                 @Override
 3                 public void onItemClick(View view, int position) {
 4                     Intent intent = new Intent(getActivity(), ArticleDetailActivity.class);
 5                     Post post = mAdapter.getPost(position);
 6                     if (post == null) return;
 7                     intent.putExtra(Define.KEY_DATE, post.getDate());
 8                     intent.putExtra(Define.KEY_NAME, post.getName());
 9                     startActivity(intent);
10                 }
11             });

注意:異なるsubviewに対するクリックイベント処理が必要な場合は、onItemClickではviewタイプまたは他のtagクラスIDに基づいて区別して自己処理する必要があります.
 
2.下部Progressbarロード表示.ListViewのアダプタと同様に、通常は通常itemを表示し、ロードしたitemが現在最後であるか否かを判断し、現在最後であればカスタムFootviewとして表示し、データロードを行うことを通知し、データロード完了後にリフレッシュする.
まず、2つのitemのHolderを定義し、正常と下部を定義し、アダプタで判断する必要があります.
 
    private final int TYPE_ITEM = 0;
    private final int TYPE_FOOTER = 1;

2つの値を定義して、異なるholderを区別します.
 
 @Override
    public int getItemViewType(int position) {
        if (position + 1 == getItemCount()) {
            return TYPE_FOOTER;
        } else {

                return TYPE_ITEM;
        }
    }

getItemView Typeを再ロードし、現在位置からFootViewをロードするかどうかを判断します.
 
 1 @Override
 2     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
 3         if (viewType == TYPE_FOOTER) {
 4             FooterViewHolder holder = new FooterViewHolder(
 5                     LayoutInflater.from(parent.getContext()).inflate(R.layout.footerview, parent, false));
 6             return holder;
 7         }else{
 8             NormalAnswerWithDateHolder holder = new NormalAnswerWithDateHolder(
 9                     LayoutInflater.from(parent.getContext()).inflate(R.layout.item_homewithdate, parent, false), mClickListener);
10             return holder;
11         }
12     }

現在のタイプに応じて異なるViewHolderをロード
 
より多くのロードがトリガーされ、現在スクロールされているitemの位置を判断するには、RecyclerViewのsetOnScrollListenerイベントのみが使用されます.
 1 mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
 2             @Override
 3             public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
 4                 super.onScrollStateChanged(recyclerView, newState);
 5                 if (newState == RecyclerView.SCROLL_STATE_IDLE
 6                         && mLinearLayoutManager.findLastVisibleItemPosition() + 1
 7                         == mAdapter.getItemCount()) {
 8                     requestOldData();
 9                 }
10             }
11         });

 
終わります.