要使用RecyclerView需添加依赖:compile 'com.android.support:recyclerview-v7:25.3.1'
-
RecyclerView添加点击选中效果
- itemView布局文件增加一个选中效果如下:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/iv_selected_bg"
android:layout_width="54dp"
android:layout_height="54dp"
android:background="@color/colorAccent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/iv_pic"
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@drawable/img_small_def3"
app:layout_constraintBottom_toBottomOf="@+id/iv_selected_bg"
app:layout_constraintLeft_toLeftOf="@+id/iv_selected_bg"
app:layout_constraintRight_toRightOf="@+id/iv_selected_bg"
app:layout_constraintTop_toTopOf="@+id/iv_selected_bg" />
</android.support.constraint.ConstraintLayout>
- 在Adapter中增加一个标记存储当前选中position
private int selectPosition = -1;
- 在onBindViewHolder方法中设置itemView点击事件,并传递当前position到selectPosition
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
TestBean bean = (TestBean) dataList.get(position);
//如果选中的item是当前position的item,则显示选中效果
((PicHolder) holder).ivSelect.setVisibility(selectPosition == position ? View.VISIBLE : View.INVISIBLE);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//这里按下item将当前position设置为selectPosition并通知更新列表
selectPosition = position;
//这里存在一个问题,就是会刷新全部数据,数据量大会牺牲效率
notifyDataSetChanged();
}
});
}
- 如果需要一进入列表就有选中效果,在Adapter中添加如下方法
/**
* 默认选中位置
*
* @param position
*/
public void select(int position) {
this.selectPosition = position;
notifyDataSetChanged();
}
效果如图:-
RecyclerView使用GridLayoutManager
1.很多时候各item之间宽度需要均等,在item布局中父控件宽度应该设置为android:layout_width="match_parent"
目标控件应该设置为居中显示android:layout_gravity="center"
不然会出现左边item均分了,右边还剩很大一片空白问题