本文介绍了ListView给每个Item上面的按钮添加事件,具体如下:
1.先看下效果图:
在这里仅供测试,我把数据都写死了,根据需要可以自己进行修改,此外实现ListView上面每个Item上的Button的事件有两种方法:
1.使用final变量扩展局部变量的生命周期范围主要代码(本文最后附全部代码):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
//注意原本getView方法中的int position变量是非final的,现在改为final
@Override
public
View getView(
final
int
position, View convertView, ViewGroup parent) {
ViewHolder holder =
null
;
if
(convertView ==
null
) {
holder=
new
ViewHolder();
//可以理解为从vlist获取view 之后把view返回给ListView
convertView = mInflater.inflate(R.layout.vlist,
null
);
holder.title = (TextView)convertView.findViewById(R.id.title);
holder.info = (TextView)convertView.findViewById(R.id.info);
holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder)convertView.getTag();
}
holder.title.setText((String)mData.get(position).get(
"title"
));
holder.info.setText((String)mData.get(position).get(
"info"
));
holder.viewBtn.setTag(position);
//给Button添加单击事件 添加Button之后ListView将失去焦点 需要的直接把Button的焦点去掉
holder.viewBtn.setOnClickListener(
new
View.OnClickListener() {
@Override
public
void
onClick(View v) {
showInfo(position);
}
});
//holder.viewBtn.setOnClickListener(MyListener(position));
return
convertView;
}
}
//提取出来方便点
public
final
class
ViewHolder {
public
TextView title;
public
TextView info;
public
Button viewBtn;
}
public
void
showInfo(
int
position){
ImageView img=
new
ImageView(ListViewActivity.
this
);
img.setImageResource(R.drawable.b);
new
AlertDialog.Builder(
this
).setView(img)
.setTitle(
"详情"
+position)
.setMessage(
"菜名:"
+title[position]+
" 价格:"
+info[position])
.setPositiveButton(
"确定"
,
new
DialogInterface.OnClickListener() {
@Override
public
void
onClick(DialogInterface dialog,
int
which) {
}
})
.show();
}
|
2.使用类记录每个Button的位置,使每个BUTTON都有自己的Listener主要代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
//****************************************第二种方法,高手一般都用此种方法,具体原因,我还不清楚,有待研究
public
View getView(
int
position, View convertView, ViewGroup parent) {
ViewHolder holder =
null
;
MyListener myListener=
null
;
if
(convertView ==
null
) {
holder=
new
ViewHolder();
//可以理解为从vlist获取view 之后把view返回给ListView
myListener=
new
MyListener(position);
convertView = mInflater.inflate(R.layout.vlist,
null
);
holder.title = (TextView)convertView.findViewById(R.id.title);
holder.info = (TextView)convertView.findViewById(R.id.info);
holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder)convertView.getTag();
}
holder.title.setText((String)mData.get(position).get(
"title"
));
holder.info.setText((String)mData.get(position).get(
"info"
));
holder.viewBtn.setTag(position);
//给Button添加单击事件 添加Button之后ListView将失去焦点 需要的直接把Button的焦点去掉
holder.viewBtn.setOnClickListener( myListener);
//holder.viewBtn.setOnClickListener(MyListener(position));
return
convertView;
}
}
private
class
MyListener
implements
OnClickListener{
int
mPosition;
public
MyListener(
int
inPosition){
mPosition= inPosition;
}
@Override
public
void
onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(ListViewActivity.
this
, title[mPosition], Toast.LENGTH_SHORT).show();
}
}
//提取出来方便点
public
final
class
ViewHolder {
public
TextView title;
public
TextView info;
public
Button viewBtn;
}
|
3.全部代码
1.ListViewActivity.Java全部代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
|
package
ms.ListView;
import
java.util.ArrayList;
import
java.util.HashMap;
import
java.util.List;
import
java.util.Map;
import
android.app.Activity;
import
android.app.AlertDialog;
import
android.content.Context;
import
android.content.DialogInterface;
import
android.os.Bundle;
import
android.view.LayoutInflater;
import
android.view.View;
import
android.view.View.OnClickListener;
import
android.view.ViewGroup;
import
android.widget.AdapterView;
import
android.widget.AdapterView.OnItemSelectedListener;
import
android.widget.BaseAdapter;
import
android.widget.Button;
import
android.widget.ImageView;
import
android.widget.ListView;
import
android.widget.TextView;
import
android.widget.Toast;
public
class
ListViewActivity
extends
Activity {
/** Called when the activity is first created. */
private
List<Map<String, Object>> mData;
private
int
flag;
public
static
String title[]=
new
String[]{
"菜名0"
,
"菜名1"
,
"菜名2"
,
"菜名3"
,
"菜名4"
,
"菜名5"
,
"菜名6"
,
"菜名7"
,
"菜名8"
,
"菜名9"
};
public
static
String info[]=
new
String[]{
"¥:28"
,
"¥:28"
,
"¥:28"
,
"¥:28"
,
"¥:28"
,
"¥:28"
,
"¥:28"
,
"¥:28"
,
"¥:28"
,
"¥:28"
,};
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.main);
mData = getData();
ListView listView = (ListView) findViewById(R.id.listView);
MyAdapter adapter =
new
MyAdapter(
this
);
listView.setAdapter(adapter);
}
//获取动态数组数据 可以由其他地方传来(json等)
private
List<Map<String, Object>> getData() {
List<Map<String, Object>> list =
new
ArrayList<Map<String, Object>>();
for
(
int
i=
0
;i<title.length;i++){
Map<String, Object> map =
new
HashMap<String, Object>();
map.put(
"title"
, title[i]);
map.put(
"info"
, info[i]);
list.add(map);
}
return
list;
}
public
class
MyAdapter
extends
BaseAdapter {
private
LayoutInflater mInflater;
public
MyAdapter(Context context) {
this
.mInflater = LayoutInflater.from(context);
}
@Override
public
int
getCount() {
// TODO Auto-generated method stub
return
mData.size();
}
@Override
public
Object getItem(
int
position) {
// TODO Auto-generated method stub
return
null
;
}
@Override
public
long
getItemId(
int
position) {
// TODO Auto-generated method stub
return
0
;
}
//****************************************final方法
//注意原本getView方法中的int position变量是非final的,现在改为final
@Override
public
View getView(
final
int
position, View convertView, ViewGroup parent) {
ViewHolder holder =
null
;
if
(convertView ==
null
) {
holder=
new
ViewHolder();
//可以理解为从vlist获取view 之后把view返回给ListView
convertView = mInflater.inflate(R.layout.vlist,
null
);
holder.title = (TextView)convertView.findViewById(R.id.title);
holder.info = (TextView)convertView.findViewById(R.id.info);
holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder)convertView.getTag();
}
holder.title.setText((String)mData.get(position).get(
"title"
));
holder.info.setText((String)mData.get(position).get(
"info"
));
holder.viewBtn.setTag(position);
//给Button添加单击事件 添加Button之后ListView将失去焦点 需要的直接把Button的焦点去掉
holder.viewBtn.setOnClickListener(
new
View.OnClickListener() {
@Override
public
void
onClick(View v) {
showInfo(position);
}
});
//holder.viewBtn.setOnClickListener(MyListener(position));
return
convertView;
}
}
//****************************************第二种方法,高手一般都用此种方法,具体原因,我还不清楚,有待研究
// public View getView(int position, View convertView, ViewGroup parent) {
// ViewHolder holder = null;
// MyListener myListener=null;
// if (convertView == null) {
//
// holder=new ViewHolder();
//
// //可以理解为从vlist获取view 之后把view返回给ListView
// myListener=new MyListener(position);
//
// convertView = mInflater.inflate(R.layout.vlist, null);
// holder.title = (TextView)convertView.findViewById(R.id.title);
// holder.info = (TextView)convertView.findViewById(R.id.info);
// holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);
// convertView.setTag(holder);
// }else {
// holder = (ViewHolder)convertView.getTag();
// }
//
// holder.title.setText((String)mData.get(position).get("title"));
// holder.info.setText((String)mData.get(position).get("info"));
// holder.viewBtn.setTag(position);
// //给Button添加单击事件 添加Button之后ListView将失去焦点 需要的直接把Button的焦点去掉
// holder.viewBtn.setOnClickListener( myListener);
//
// //holder.viewBtn.setOnClickListener(MyListener(position));
//
// return convertView;
// }
// }
//
// private class MyListener implements OnClickListener{
// int mPosition;
// public MyListener(int inPosition){
// mPosition= inPosition;
// }
// @Override
// public void onClick(View v) {
// // TODO Auto-generated method stub
// Toast.makeText(ListViewActivity.this, title[mPosition], Toast.LENGTH_SHORT).show();
// }
//
// }
//
//
//提取出来方便点
public
final
class
ViewHolder {
public
TextView title;
public
TextView info;
public
Button viewBtn;
}
public
void
showInfo(
int
position){
ImageView img=
new
ImageView(ListViewActivity.
this
);
img.setImageResource(R.drawable.b);
new
AlertDialog.Builder(
this
).setView(img)
.setTitle(
"详情"
+position)
.setMessage(
"菜名:"
+title[position]+
" 价格:"
+info[position])
.setPositiveButton(
"确定"
,
new
DialogInterface.OnClickListener() {
@Override
public
void
onClick(DialogInterface dialog,
int
which) {
}
})
.show();
}
}
|
2.main.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
android:layout_width
=
"fill_parent"
android:layout_height
=
"fill_parent"
android:orientation
=
"vertical"
>
<
ListView
android:id
=
"@+id/listView"
android:layout_width
=
"fill_parent"
android:layout_height
=
"fill_parent"
android:divider
=
"@drawable/list_line"
android:dividerHeight
=
"1dip"
/>
</
LinearLayout
>
|
3.vlist.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
android:layout_width
=
"fill_parent"
android:layout_height
=
"fill_parent"
android:orientation
=
"vertical"
>
<
ListView
android:id
=
"@+id/listView"
android:layout_width
=
"fill_parent"
android:layout_height
=
"fill_parent"
android:divider
=
"@drawable/list_line"
android:dividerHeight
=
"1dip"
/>
</
LinearLayout
>
|
4.btn_detail_selecter.xml
1
2
3
4
5
6
7
8
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
item
android:drawable
=
"@drawable/btn_detail_normal"
android:state_enabled
=
"true"
android:state_focused
=
"false"
android:state_pressed
=
"false"
/>
<
item
android:drawable
=
"@drawable/btn_detail_pressed"
android:state_enabled
=
"true"
android:state_pressed
=
"true"
/>
<
item
android:drawable
=
"@drawable/btn_detail_pressed"
android:state_enabled
=
"true"
android:state_focused
=
"true"
/>
</
selector
>
|
5.item.xml
1
2
3
4
5
6
7
8
9
10
|
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
item
android:drawable
=
"@drawable/item_higlight"
android:state_focused
=
"true"
android:state_pressed
=
"false"
/>
<
item
android:drawable
=
"@drawable/item_higlight"
android:state_focused
=
"false"
android:state_pressed
=
"true"
/>
<
item
android:drawable
=
"@drawable/item_higlight"
android:state_selected
=
"true"
/>
<
item
android:drawable
=
"@drawable/item_higlight"
android:state_focused
=
"true"
/>
<
item
android:drawable
=
"@drawable/item_higlight"
/>
</
selector
>
|
6.colors.xml
1
2
3
4
5
6
7
|
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
resources
>
<
color
name
=
"region"
>#8000ff00</
color
>
<
color
name
=
"listTitle"
>#ff23323b</
color
>
<
color
name
=
"text"
>#ff848f9b</
color
>
<
color
name
=
"write"
>#ffffffff</
color
>
</
resources
>
|
7.values.xml
1
2
3
4
5
6
7
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
resources
>
<
string
name
=
"hello"
>Hello World, ListViewActivity!</
string
>
<
string
name
=
"app_name"
>ListView</
string
>
</
resources
>
|
8.drawables.xml
1
2
3
4
5
6
7
8
9
|
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
resources
>
<
item
type
=
"drawable"
name
=
"bg"
>#80000000</
item
>
<
item
type
=
"drawable"
name
=
"transparent"
>#00000000</
item
>
<
item
type
=
"drawable"
name
=
"lightblue"
>#ffcfe1ed</
item
>
<
item
type
=
"drawable"
name
=
"readmenu_btn_bg_f"
>#30ffffff</
item
>
<
item
type
=
"drawable"
name
=
"readmenu_btn_bg_p"
>#50ffffff</
item
>
<
item
type
=
"drawable"
name
=
"blackMask"
>#30000000</
item
>
</
resources
>
|
源码下载:源码下载地址
原文链接:http://blog.csdn.net/qq435757399/article/details/8256453
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
<div class="art_xg">
- 1
您可能感兴趣的文章:
- Android ListView的item背景色设置和item点击无响应的解决方法
- Android开发之ListView实现Item局部刷新
- Android使用ListView批量删除item的方法
- Android 中ListView的Item点击事件失效的快速解决方法
- Android中ListView Item布局优化技巧
- Android使用Item Swipemenulistview实现仿QQ侧滑删除功能
- Android ListView的Item点击效果的定制
- Android 中通过ViewDragHelper实现ListView的Item的侧拉划出效果
- Android开发实现ListView点击item改变颜色功能示例