RecyclerView能够灵活实现大数据记的展示,视图的复用管理比ListView更好,能够显示列表、网格、瀑布流、等形式,且不同的ViewHolder能够实现item多元化的功能
但是它没有类似于ListView的onItemClickListener监听事件,需要自己实现
一、
创建过程
在app文件夹下的build.gradle中添加
compile 'com.android.support:design:27.1.1'
其中27.1.1与版本有关
新建LinearActivity 列表视图RecyclerView在其布局文件中添加RecyclerView
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#555"/>
</RelativeLayout>
设置每个item项目 新建layout_linear_item.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center"
android:textSize="20sp"
android:background="#A1F2F2"/>
</LinearLayout>
在LinearActivity中实例化RecyclerView 并对其进行修饰
public class LinearActivity extends AppCompatActivity {
private RecyclerView mRvMain;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_linear);
mRvMain = findViewById(R.id.rv_main);
mRvMain.setLayoutManager(new LinearLayoutManager(LinearActivity.this));
//LinearLauoutManger是一个线性管理器
mRvMain.addItemDecoration(new MyDecoration());//这个方法能够实现分割线,但这个方法不是专门用来实现分割线的
LinearAdapter adapter = new LinearAdapter(LinearActivity.this);
adapter.setListener(new LinearAdapter.OnItemClickListener() {
@Override
public void onClick(int pos) {
Toast.makeText(LinearActivity.this,"click"+pos,Toast.LENGTH_SHORT).show();
}
});
adapter.setLongListener(new LinearAdapter.OnItemLongClickListener() {
@Override
public void onLongClick(int pos) {
Toast.makeText(LinearActivity.this,"clicklong"+pos,Toast.LENGTH_SHORT).show();
}
});
mRvMain.setAdapter(adapter);
// mRvMain.setAdapter(new LinearAdapter(LinearActivity.this, new LinearAdapter.OnItemLongClickListener() {
// @Override
// public void onLongClick(int pos) {
// Toast.makeText(LinearActivity.this,"clicklong"+pos,Toast.LENGTH_SHORT).show();
// }
// }));
}
class MyDecoration extends RecyclerView.ItemDecoration{ //修饰
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
outRect.set(0,0,0,getResources().getDimensionPixelOffset(R.dimen.dividerHeight)); //在res中的values新建了一个dimen
}
}
}
使用
LinearLayoutManager线性布局管理器,传入本活动的activity
设置addItemDecoration 对item外进行修饰 对其进行修饰 新建MyDecoration专门设置对其修饰
在values中新建dimens
<resources>
<dimen name="dividerHeight">1dp</dimen>
</resources>
设置LinearAdapter
public class LinearAdapter extends RecyclerView.Adapter<LinearAdapter.LinearViewHolder> { //传入泛型
private Context mContext;
private OnItemClickListener mListener;
private OnItemLongClickListener mLongListener;
public LinearAdapter(Context mContext) {
this.mContext = mContext;
}
class LinearViewHolder extends RecyclerView.ViewHolder{
//声明布局中的控件
private TextView textView;
public LinearViewHolder(View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.tv_title);
}
}
public void setListener(OnItemClickListener mListener) {
this.mListener = mListener;
}
public void setLongListener(OnItemLongClickListener mLongListener) {
this.mLongListener = mLongListener;
}
@NonNull
@Override
public LinearViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new LinearViewHolder(LayoutInflater.from(mContext).inflate(R.layout.layout_linear_item,parent,false));//ViewHolder中传入一个布局view
}
public interface OnItemClickListener{
void onClick(int pos);
}
public interface OnItemLongClickListener{
void onLongClick(int pos);
}
@Override
public void onBindViewHolder(LinearAdapter.LinearViewHolder holder, final int position) {//绑定ViewHolder 将holder也改为自己定义的LinearViewHolder
holder.textView.setText("hello world");
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.onClick(position);
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
mLongListener.onLongClick(position);
return true;
}
});
}
@Override
public int getItemCount() {
return 30;
}
}
首先@Override onCreateViewHolder onBindViewHolder GetItemCount
设置了长按与点击事件
自定义Holder LinearViewHolder