RecycleView item点击事件实现,item放大缩小动画布局不变形

来源:互联网 发布:淘宝手机类目保证金 编辑:程序博客网 时间:2024/06/06 02:11

为RecyclerView的每个子item设置setOnClickListener,然后在onClick中再调用一次对外封装的接口,将这个事件传递给外面的调用者。而“为RecyclerView的每个子item设置setOnClickListener”在Adapter中设置。其实直接在onClick中也能完全处理item的点击事件,但是这样会破坏代码的逻辑。

步骤

adapter中

自定义一个继承自RecyclerView.Adapter的MyAdapter。

1.在MyAdapter中定义如下接口,模拟ListView的OnItemClickListener:

public interface OnItemClickListener {        void onItemClick(View view, int position);    }
2.声明一个这个接口的变量

    public OnItemClickListener mOnItemClickListener;

3.建MyHolder集成RecycleView.ViewHolder

 
class SpeedHourHolder extends RecyclerView.ViewHolder {    LinearLayout speedView;    ImageView speedImage;    public SpeedHourHolder(View itemView) {        super(itemView);    }}

4.在onCreateViewHolder()中绑定holder每个view

  @Override    public SpeedHourHolder onCreateViewHolder(ViewGroup parent, int viewType) {        View view = mInflater.inflate(R.layout.item_project, parent, false);        SpeedHourHolder holder = new SpeedHourHolder(view);        holder.speedImage = (ImageView) view.findViewById(R.id.speed_image);        holder.speedView = (LinearLayout) view.findViewById(R.id.speed_view);        return holder;    }

5.在onBindViewHolder()方法中设置和item相关的数据,设置item的点击事件,注意在这里设置点击item的动画,可以实现点击的item放大,其余缩放到原位置,注意数据的刷新

 @Override    public void onBindViewHolder(final SpeedHourHolder holder, final int position) {        final ProjectEntity.TopicBean.ItemsBean.ListBean bean = specailList.get(position);        if (bean != null) {            holder.speedImage.setScaleType(ImageView.ScaleType.FIT_XY);            Glide.with(mContext).load(bean.pic).error(R.mipmap.welfare_default_icon).into(holder.speedImage);        }        if (currentIndex == position) {            holder.speedView.setScaleX(1.5f);            holder.speedView.setScaleY(1.5f);        } else {            holder.speedView.setScaleX(1f);            holder.speedView.setScaleY(1f);        }        holder.speedView.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                if (mOnItemClickListener != null) {                    currentIndex = position;                    notifyDataSetChanged();                    mOnItemClickListener.onItemClick(holder.speedView, position);                }            }        });    }

6.最后暴露给外面的调用者,定义一个设置Listener的方法():

  public void setOnItemClickListener(OnItemClickListener mOnItemClickLitener) {        this.mOnItemClickListener = mOnItemClickLitener;    }

以上所有步骤都发生在自定义的adapter中,典型的观察者模式,有点绕的地方在于,这里涉及到两个观察者模式的使用,view的setOnClickListener本来就是观察者模式,我们将这个观察者模式的事件监听传递给了我们自己的观察者模式。

7.在Activity中使用:

private void initAdapter() {

  
 private void initAdapter() {        projectAdapter = new ProjectAdapter(this);        recyclerView_project.setAdapter(projectAdapter);        if (projectEntity != null && projectEntity.topic != null && projectEntity.topic.items != null && projectEntity.topic.items.size() > 0) {            List<ProjectEntity.TopicBean.ItemsBean.ListBean> listBeen = projectEntity.topic.items.get(0).list;            if (listBeen != null && listBeen.size() > 0) {                listBeen.get(2).setPlay(true);                mList.addAll(listBeen);                projectAdapter.setList(listBeen);            }        }        projectAdapter.setOnItemClickListener(new ProjectAdapter.OnItemClickListener() {            @Override            public void onItemClick(View view, int position) {                Toast.makeText(MainActivity.this, "测试中", Toast.LENGTH_SHORT).show();            }        });    }



完整代码

ProjectAdapter.java

public class ProjectAdapter extends RecyclerView.Adapter<SpeedHourHolder> {    private int currentIndex = 2;    private List<ProjectEntity.TopicBean.ItemsBean.ListBean> specailList;    private LayoutInflater mInflater;    private Context mContext = null;    public ProjectAdapter(Context context) {        this.mContext = context;        mInflater = LayoutInflater.from(context);    }    public void setList(List<ProjectEntity.TopicBean.ItemsBean.ListBean> list) {        this.specailList = list;        notifyDataSetChanged();    }    public OnItemClickListener mOnItemClickListener;    public interface OnItemClickListener {        void onItemClick(View view, int position);    }    public void setOnItemClickListener(OnItemClickListener mOnItemClickLitener) {        this.mOnItemClickListener = mOnItemClickLitener;    }    @Override    public SpeedHourHolder onCreateViewHolder(ViewGroup parent, int viewType) {        View view = mInflater.inflate(R.layout.item_project, parent, false);        SpeedHourHolder holder = new SpeedHourHolder(view);        holder.speedImage = (ImageView) view.findViewById(R.id.speed_image);        holder.speedView = (LinearLayout) view.findViewById(R.id.speed_view);        return holder;    }    @Override    public void onBindViewHolder(final SpeedHourHolder holder, final int position) {        final ProjectEntity.TopicBean.ItemsBean.ListBean bean = specailList.get(position);        if (bean != null) {            holder.speedImage.setScaleType(ImageView.ScaleType.FIT_XY);            Glide.with(mContext).load(bean.pic).error(R.mipmap.welfare_default_icon).into(holder.speedImage);        }        if (currentIndex == position) {            holder.speedView.setScaleX(1.5f);            holder.speedView.setScaleY(1.5f);        } else {            holder.speedView.setScaleX(1f);            holder.speedView.setScaleY(1f);        }        holder.speedView.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                if (mOnItemClickListener != null) {                    currentIndex = position;                    notifyDataSetChanged();                    mOnItemClickListener.onItemClick(holder.speedView, position);                }            }        });    }    @Override    public int getItemCount() {        return specailList.size();    }}class SpeedHourHolder extends RecyclerView.ViewHolder {    LinearLayout speedView;    ImageView speedImage;    public SpeedHourHolder(View itemView) {        super(itemView);    }}


item.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:ptr="http://schemas.android.com/apk/res-auto"    android:id="@+id/speed_view"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:gravity="center"    android:orientation="vertical"    android:padding="10dp">    <ImageView        android:id="@+id/speed_image"        android:layout_width="50dp"        android:layout_height="50dp"        android:scaleType="fitXY"        android:src="@mipmap/speed_icon" /></LinearLayout>


MainActivity.java

ContentView(R.layout.activity_main)public class MainActivity extends AppCompatActivity {    @ViewInject(R.id.recycler_view)    private RecyclerView recyclerView_project;    private ProjectEntity projectEntity;    private ProjectAdapter projectAdapter = null;    private List<ProjectEntity.TopicBean.ItemsBean.ListBean> mList = new ArrayList<>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        x.view().inject(this);        initView();        initData();        initAdapter();    }    private void initView() {        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);        linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);        recyclerView_project.setLayoutManager(linearLayoutManager);    }    private void initData() {        String data = FileUtils.readAssert(this, "speenhour.txt");        projectEntity = JsonUtils.parseJson(data, ProjectEntity.class);    }    private void initAdapter() {        projectAdapter = new ProjectAdapter(this);        recyclerView_project.setAdapter(projectAdapter);        if (projectEntity != null && projectEntity.topic != null && projectEntity.topic.items != null && projectEntity.topic.items.size() > 0) {            List<ProjectEntity.TopicBean.ItemsBean.ListBean> listBeen = projectEntity.topic.items.get(0).list;            if (listBeen != null && listBeen.size() > 0) {                listBeen.get(2).setPlay(true);                mList.addAll(listBeen);                projectAdapter.setList(listBeen);            }        }        projectAdapter.setOnItemClickListener(new ProjectAdapter.OnItemClickListener() {            @Override            public void onItemClick(View view, int position) {                Toast.makeText(MainActivity.this, "测试中", Toast.LENGTH_SHORT).show();            }        });    }}

0 0