RecycleView已经面世很久,现在我们几乎都在用它,很少会去用listView了,好处我就不说了,但是RecycleView有一个缺点,没有子项的点击事件,也就是列表中的每一个item的点击事件需要我们自己去实现。下面我就来讲一下,在adapter中是如何实现的(网上其实也有很多例子,我为什么还要写呢。。。至少可以加深自己对RecyclerView的理解)
先上Adapter里面的代码吧
public class ReWechatAdapter extends RecyclerView.Adapter<ReWechatAdapter.ReClassViewHolder> {
//1.
private Context mContext;
//2.
private List<BeanWechatBase.ResultBean.ListBean> mList;
public ReWechatAdapter(Context context,List<BeanWechatBase.ResultBean.ListBean> mList) {
this.mContext=context;
this.mList = mList;
}
@NonNull
@Override
public ReClassViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_we_chat, parent, false);
final ReClassViewHolder holder=new ReClassViewHolder(view);
//4.
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int position=holder.getAdapterPosition();//5.
Intent intent = new Intent(mContext, WebViewActivity.class);
intent.putExtra(WebViewActivity.TITLE,mList.get(position).getTitle());
intent.putExtra(WebViewActivity.url, mList.get(position).getUrl());
mContext.startActivity(intent);
}
});
//6.
holder.mNewPicture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int position=holder.getAdapterPosition();
Toast.makeText(mContext,position+"我是图片啊1111",Toast.LENGTH_SHORT).show();
}
});
//7.
holder.mNewPicture.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
int position=holder.getAdapterPosition();
Toast.makeText(mContext,position+"我是图片,长按我干嘛。。。",Toast.LENGTH_SHORT).show();
return true;
}
});
return holder;
}
@Override
public void onBindViewHolder(@NonNull ReClassViewHolder holder, int position) {
BeanWechatBase.ResultBean.ListBean listBean = mList.get(position);
holder.mSource.setText(listBean.getSource());
holder.mTvTitle.setText(listBean.getTitle());
holder.itemView.setTag(position);
}
@Override
public int getItemCount() {
return mList.size();
}
//3.
static class ReClassViewHolder extends RecyclerView.ViewHolder {
ImageView mNewPicture;
TextView mTvTitle;
TextView mSource;
public ReClassViewHolder(View itemView) {
super(itemView);
mNewPicture = itemView.findViewById(R.id.iv_new_picture);
mTvTitle = itemView.findViewById(R.id.tv_title);
mSource = itemView.findViewById(R.id.tv_resource);
}
}
}
用到的R.layout.item_we_chat xml文件如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="80dp"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@color/white"
android:orientation="horizontal">
<android.support.v7.widget.CardView
android:layout_width="140dp"
android:layout_height="80dp"
app:cardCornerRadius="5dp"
app:cardElevation="1dp">
<ImageView
android:id="@+id/iv_new_picture"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/apple_pic"/>
</android.support.v7.widget.CardView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="5dp"
android:layout_marginBottom="5dp"
android:orientation="vertical">
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="标题"
android:ellipsize="end"/>
<TextView
android:id="@+id/tv_resource"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:gravity="right"
android:layout_margin="2dp"
android:text="来源"/>
</LinearLayout>
</LinearLayout>
上面就是一个完整的Adapter的代码,在代码中我们可以看到我标记1~7,下面我来解释一下含义(如果有不对的请指正)
1.是声明的一个上下文环境,是可以不写的,但是下面点击事件我需要跳Activity,需要用到。
2.是我这边定义的数据类,就是为了填充item的,就没帖上来,因为每个人写的item应该都不一样
3.这里就是定义一个内部类并且继承RecyclerView.ViewHolder,内部类里面还有个构造方法,里面的参数View,就是RecycleView的每一个item视图,目的就是为了拿到item布局的实例(也就是里面的控件)
4.item的点击事件
5.拿到item的下标,从0开始,因为我们拿到了这个,才能从类 mList中一对一的填充数据啊
6.item里面的图片点击事件
7.item里面图片的长按点击事件(item的长按点击事件也是同理)
还有一点 如何从fragment或activity把数据传到adapter中 两行代码搞定:
ReWechatAdapter mAdapter=new ReWechatAdapter(getActivity(),mlist);
mRecycleView.setAdapter(mAdapter);
这里我从fragment里面传的,getActivity()拿到上下文环境(不过使用getActivity()可能有缺陷,后面我在看看),mlist是我在fragemnt中获得的数据,传给adaper中List<BeanWechatBase.ResultBean.ListBean> mList。
有点啰嗦了,有不对的可以联系我,及时改正,谢谢大家!