如何给ListView中每个item设置点击触发事件


title: 如何给ListView中每个item设置点击触发事件
date: 2019-08-20 08:19:26
tags: android


如何给ListView中每个item设置onClick()

咋做?

先将ListView里的android:clickable和android:focusable字段设置成true

然后在MainActivity中添加监听器OnItemClickListener

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        // 通过getAdapter()方法取得MyAdapter对象,再调用getItem(int)返回一个Data对象
        Data t = (Data) listView.getAdapter().getItem(i);

        // 将点击的item里面的字弹出来
        Toast.makeText(MainActivity.this, t.getText(), Toast.LENGTH_SHORT).show();
    }
});

例子

先看看最终效果:

OnClickItem_p1.png

设置每一个item的layout布局

layout/list_view_item.xml

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

    <TextView
        android:id="@+id/text_item"
        android:layout_height="30dp"
        android:textSize="30sp"
        android:layout_width="match_parent"
        />

</LinearLayout>

主activity布局,比较重要的是,要将ListView中的android:clickable和android:focusable字段都设置成true.

layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <!-- 这里的关键是要将clickable和focusable设置成true -->
    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:clickable="true"
        android:focusable="true"
        android:id="@+id/list_view"
        />
    
</androidx.constraintlayout.widget.ConstraintLayout>

特别简单的Data类,里面只有一个String。

Data.java

public class Data {
    private String Text;

    public String getText() {
        return Text;
    }

    public void setText(String text) {
        Text = text;
    }
}

自定义一个BaseAdapter

MyAdapter.java

public class MyAdapter extends BaseAdapter{
    private LinkedList<Data> mDataList;
    private Context mContext;

    // 构造函数
    public MyAdapter(LinkedList<Data> mDataList, Context mContext) {
        this.mDataList = mDataList;
        this.mContext = mContext;
    }

    @Override
    public int getCount() {
        return mDataList.size();
    }

    @Override
    public Object getItem(int i) {
        return mDataList.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @SuppressLint("ViewHolder")
    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder holder = new ViewHolder();
        view = LayoutInflater.from(this.mContext).inflate(R.layout.list_view_item, viewGroup, false);
        TextView text = (TextView) view.findViewById(R.id.text_item);
        text.setText(mDataList.get(i).getText());
        holder.setTextView(text);
        view.setTag(holder);
        return view;
    }
    class ViewHolder{
        private TextView textView;

        public TextView getTextView() {
            return textView;
        }

        public void setTextView(TextView textView) {
            this.textView = textView;
        }
    }
}

最后是

MainActivity.java

public class MainActivity extends AppCompatActivity {

    ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 这里将需要的data适配到listView里面
        LinkedList<Data> data = new LinkedList<Data>();
        for(int i = 0; i < 10; i++) {
            Data d = new Data();
            d.setText("item"+ (i + 1) +"我是一个兵!!!!!");
            data.add(d);
        }
        listView = findViewById(R.id.list_view);
        MyAdapter myAdapter = new MyAdapter(data, this);
        listView.setAdapter(myAdapter);

        // 这里设置OnItemClickListener
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            
            //这里的i是点击事件发生的item对应的位置
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            
                // 通过getAdapter()方法取得MyAdapter对象,再调用getItem(int)返回一个Data对象
                Data t = (Data) listView.getAdapter().getItem(i);
                
                // 将点击的item里面的字弹出来
                Toast.makeText(MainActivity.this, t.getText(), Toast.LENGTH_SHORT).show();
            }
        });
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,860评论 0 17
  • 一、上节回顾: (一)、三大表单控件中需要记忆的核心方法: 1、RadioButton: RadioGroup类中...
    白话徐文涛阅读 6,490评论 1 7
  • Day1: 在代码中通过R.string.hello_world可以获得该字符串的引用; 在XML中通过@stri...
    冰凝雪国阅读 5,356评论 0 5
  • 茶如人,合适的才是最好的。 如果今天喝的这杯就是普洱的话,那么显然我家一直在喝的就不是普洱了,继而所谓寄托游子...
    芸吞阅读 1,711评论 0 0
  • 一年一度的双十一马上又到了,网上早早就充斥了各种买买买的话题。广告宣传早早就铺天盖地,每次打开网页,都要花几秒钟去...
    荷洁在阅读 3,558评论 1 1

友情链接更多精彩内容