把listview的item和button一起设置为一个点击事件
解决方案 »
- android邮件客户端一般用什么保存已经下载的数据
- android客户端通过域名连接服务器报unknowhostexception
- 如何获取当前屏幕显示的是Launcher还是其它的App呢?
- android两个动画叠加怎么实现?
- 手机当导游 玩转深圳大运会必备软件—乐游深圳(大运版)
- 如何在ItemizedOverlay中实现startactivity跳转
- 如何修改二进制文件中的一段?
- 设置时钟时的rtc/1000<Integer.MAX_VALUE有什么用处
- 如何在cpp中使用一个静态库然后编译生成动态库或者静态库
- SwipeLayout里面关于position的问题
- android 图片不能拉伸,apk图标
- 怎么将数据库获取的数据显示在Spinner中
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="测试listview内含button"
/>
<ListView android:id="@+id/code_list" android:background="#ffffffff"
android:fadingEdgeLength="0.0sp" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:drawSelectorOnTop="false"
android:cacheColorHint="#ffffffff" android:dividerHeight="2.0dip"
android:layout_weight="0.0" android:fastScrollEnabled="true"
android:scrollbars="none" />
</LinearLayout>然后项目布局:listview_item_button.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- ListView Item -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:minHeight="40dip" android:gravity="center_vertical"
android:descendantFocusability= "blocksDescendants"> <Button android:textSize="17sp" android:textStyle="bold"
android:textColor="#ff000000" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="点击按钮" android:id="@+id/btnCktp"
android:layout_alignParentRight="true"
android:focusable="false" android:clickable="true"/> <TextView android:id="@+id/tvMsg" android:layout_width="fill_parent"
android:layout_height="40dip" android:textSize="16dip"
android:gravity="center_vertical|left" android:textColor="#ff000000"
android:layout_alignParentLeft="true" android:layout_toLeftOf="@id/btnCktp">
</TextView></RelativeLayout>测试activity:testListViewActivity
package bee.android.control;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.Toast;public class testListViewActivity extends Activity {
ListView code_list;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview_main);
code_list = (ListView)findViewById(R.id.code_list);
// 给listview赋值,模拟数据
List<Map<String, Object>> alls = new ArrayList<Map<String, Object>>();
for(int i=0;i<20;i++){
Map<String, Object> map = new HashMap<String, Object>();
map.put("Id", i);
map.put("Text", "测试数据,当前第"+(i+1)+"行");
alls.add(map);
}
ListAdapter adapter = new ListAdapter(this,alls);
adapter.setHandler(_handler);
code_list.setAdapter(adapter);
code_list.setOnItemClickListener(new OnItemClickListener(){ @Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub Toast.makeText(testListViewActivity.this, "你点击了项目"+position, Toast.LENGTH_SHORT).show();
}
});
}
// 自定义adapter
public class ListAdapter extends BaseAdapter{ private Context con;
private LayoutInflater lif;
private List<Map<String, Object>> alls = new ArrayList<Map<String, Object>>();
private Handler handler;
public ListAdapter(Context context,List<Map<String, Object>> alls){
this.con = context;
this.lif = (LayoutInflater) con.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.alls = alls;
}
// handler回发是为了处理每个按钮的点击事件
public void setHandler(Handler handler){
this.handler = handler;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return alls.size();
} @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return alls.get(position);
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
} @Override
public View getView(final int position, View view, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder = null;
if (view == null) {
view = this.lif.inflate(R.layout.listview_item_button, null);
holder = new ViewHolder();
holder.tvMsg = (TextView)view.findViewById(R.id.tvMsg);
view.setTag(holder);
}else{
holder = (ViewHolder)view.getTag();
}
// 赋值
Map<String, Object> map = alls.get(position);
holder.tvMsg.setText(map.get("Text").toString());
holder.btnCktp = (Button)view.findViewById(R.id.btnCktp);
holder.btnCktp.setText("按钮"+map.get("Id").toString());
// 单击事件
holder.btnCktp.setOnClickListener(new OnClickListener(){ @Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(handler != null){
Message msg = handler.obtainMessage();
msg.what = v.getId();
msg.arg1 = position;
handler.sendMessage(msg);
}
}
});
return view;
}
/**
*
* 列表项控件集合
*
*/
public class ViewHolder{
TextView tvMsg;//文本〉〉〉
Button btnCktp;//按钮
}
}
Handler _handler = new Handler(){ @Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch(msg.what){//如果item项目里有多个按钮触发,可以在这里区分
case R.id.btnCktp:
Toast.makeText(testListViewActivity.this, "你点击了按钮"+msg.arg1, Toast.LENGTH_SHORT).show();
break;
}
}
};
}
它们的事件是不会相互影响的。关键是“点击Item的时候Button也会有那种被点击的颜色变化,它们事件没有相互影响”
android:name=".testListViewActivity"
直接使用ImageView来替代解决。
不要用listview的setItemOnClick方法,给listview里面其他不包含该button的地方设置点击动作,我就是给button上面的LinerLayout设置了onclicklistener
楼上的都说得很对,button在item里面,当item获得点击动作button也会获得点击动作,所以必须从这个角度出发去解决
发个图大致就能看懂了
http://vdisk.weibo.com/s/aAL7x
不要用listview的setItemOnClick方法,给listview里面其他不包含该button的地方设置点击动作,我就是给button上面的LinerLayout设置了onclicklistener
楼上的都说得很对,button在item里面,当item获得点击动作button也会获得点击动作,所以必须从这个角度出发去解决
发个图大致就能看懂了
http://vdisk.weibo.com/s/aAL7x
@Override
public void setPressed(boolean pressed) {
// TODO Auto-generated method stub
if(pressed&&getParent() instanceof View&& ((View)getParent()).isPressed())
return;
super.setPressed(pressed);
}