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

为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();
            }
        });

    }

}


版权声明:本文为qing_happy88原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。