美文网首页Android之界面
RecyclerView实现Item点击事件方法一

RecyclerView实现Item点击事件方法一

作者: QiuJay | 来源:发表于2016-07-10 15:36 被阅读4296次

RecyclerView具体是什么控件,它能做什么,相信不要我来说明了,当你能看到此文章,目的很明确,为RecyclerView实现条目点击事件,因为官方并没有为我们实现。此文章会有好几篇,每一篇会讲解一种实现方式与这种方式的不足之处。

Item Layout xml 设置onClick

Activity Code

public class XmlImpItemClickActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        RecyclerView recyclerView = new RecyclerView(this);
        setContentView(recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(new Adapter());
    }

    public void onItemClick(View view) {
        Toast.makeText(XmlImpItemClickActivity.this, "item click", Toast.LENGTH_SHORT).show();
    }
}

Adapter Code

public class Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.xml_imp_click_item,parent,false);
        return new ViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        TextView textView = (TextView) holder.itemView.findViewById(android.R.id.text1);
        textView.setText("item" + position);
    }

    @Override
    public int getItemCount() {
        return 50;
    }

    static class ViewHolder extends RecyclerView.ViewHolder{

        public ViewHolder(View itemView) {
            super(itemView);
        }
    }
}

xml layout code

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:orientation="vertical"
    android:onClick="onItemClick"
    android:background="?attr/selectableItemBackground">

    <TextView
        android:id="@android:id/text1"
        android:gravity="center_vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

关键属性android:onClick="onItemClick",此方法在Activity中申明并实现了,下面我们看下实现效果

xml-imp

此方法是我在看google sample时看到的一种实现方式,是不是很简单,而且很速度,但有人会问了,这根本没什么作用啊,item被点击时我要怎么知道点击是哪个位置了?
so easy,看修改后的ActivityonItemClick代码,代码如下:

public void onItemClick(View view) {
        int childAdapterPosition = recyclerView.getChildAdapterPosition(view);
        Toast.makeText(XmlImpItemClickActivity.this, "item click index = "+childAdapterPosition, Toast.LENGTH_SHORT).show();
    }
xml-item-click-index
这里简单说下RecyclerView.getChildAdapterPosition()方法,此方法可以获取ItemView在Adapter中的位置,而我们onItemClick方法中的参数view刚好是我们点击的ItemView

至此我们基本实现了RecyclerView的条目点击事件并知道了怎么获取position,但这种方式实现起来确实简单,但有一个缺陷,那就是xml布局中设置的onClick只能在Activity中去实现,不能在Fragment中实现。

相关文章

网友评论

  • cheeseintrap:小白,请问大神Google sample的代码去哪里找呢,谢谢大神
    cheeseintrap:@QiuJay 谢谢大神
    QiuJay:https://github.com/googlesamples
  • 大象屁股:为什么不能在fragment中实现,跪求解答
    QiuJay: @嫱嫱与我 是的,只能在activity
    5f4b461e439a:好像因为xml中的点击事件(onclick)只能在其对应的activity中声明。无法在fragment中声明。

本文标题:RecyclerView实现Item点击事件方法一

本文链接:https://www.haomeiwen.com/subject/ooedjttx.html