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