####listview 的点击事件
######开发中很常见的一个问题,项目中的listview不仅仅是简单的文字,常常需要自己定义listview,自己的Adapter去继承BaseAdapter,在adapter中按照需求进行编写,问题就出现了,可能会发生点击每一个item的时候没有反应,无法获取的焦点。原因多半是由于在你自己定义的Item中存在诸如ImageButton,Button,CheckBox等子控件(也可以说是Button或者Checkable的子类控件),此时这些子控件会将焦点获取到,所以常常当点击item时变化的是子控件,item本身的点击没有响应。
解决方案:
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击"
android:focusable="false"/>
让这些子控件失去焦点 android:focusable=“false”
###ListView默认情况
当item有焦点时,item上的button等子控件获取不到焦点;
当子控件有焦点时,item无焦点无法响应onItemClick事件
ViewGroup.FOCUS_AFTER_DESCENDANTS:表示item的子控件优先于item获得焦点;
ViewGroup.FOCUS_BEFORE_DESCENDANTS:表示item优先于其子控件获得焦点。
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
parent.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
Toast.makeText(context,"点击了item"+position,Toast.LENGTH_SHORT).show();
Log.d("tag","点击了item");
}
});
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
总结:只有当这两个条件全都有后,listview的item和子控件就都有了点击事件
##ListView 分割线
<ListView
android:id="@+id/local_groups_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@color/divider_color"
android:dividerHeight="1px"
android:footerDividersEnabled="false"/>
要设置diverHeight才行;android:footerDividersEnabled=”false”表示最后一栏不需要分割线;
##ListView 每个item的点击事件去改变点击item的布局
http://blog.csdn.net/cai554112503/article/details/50363758
package com.daosheng.overhaulproject.Adapter;
import java.util.HashMap;
import java.util.List;
import android.app.Activity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import com.daosheng.overhaulproject.R;
import com.daosheng.overhaulproject.Adapter.ZhiJianAdapter.ViewHolder;
import com.daosheng.overhaulproject.vo.ZhiJianVo;
/**
* <b>类描述:</b>
*
* @author 创建人: maminghui
* @date 创建时间:2017-3-22 上午11:27:30 <b>修改时间:</b> <b>修改备注:</b>
*
* @version 1.0
*
*
**/
public class GuzhangHpAdapter extends ArrayListAdapter<ZhiJianVo> {
private LayoutInflater mInflater;
private View.OnClickListener onClickListener;
private HashMap<String, Object> map;
private int[] tags = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
public GuzhangHpAdapter(Activity context) {
super(context);
mInflater = LayoutInflater.from(context);
map = new HashMap<String, Object>();
}
public void IsChose(int position){
Log.d("tag", "position的位置"+position);
// if (mList.size()<2) {
resetBackGround();
// }else {
// resetBackGroundAdd();
// }
((Button)map.get(""+position)).setVisibility(View.VISIBLE);
tags [position] = 1;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mList.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
Log.d("tag", "position的位置"+position);
// if (mList.size()<2) {
// resetBackGround();
// }else {
// resetBackGroundAdd();
// }
//
// ((Button)map.get(""+position)).setVisibility(View.VISIBLE);
// tags [position] = 1;
return position;
}
private void resetBackGround() {
// TODO Auto-generated method stub
for (int i = 0; i < map.size(); i++) {
((Button)map.get(""+i)).setVisibility(View.GONE);
tags [i] = 0;
}
}
// private void resetBackGroundAdd() {
// // TODO Auto-generated method stub
// for (int i = 0; i < 2; i++) {
// ((Button)map.get(""+i)).setVisibility(View.GONE);
// tags [i] = 0;
// }
// }
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.d("tag", "getView"+position);
ViewHolder holder = null;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_zhijian, parent,false);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
ZhiJianVo bean = mList.get(position);
// LOCTYPE 车型
// LOCNO 车号
// NATURE 故障来源
// TPTIME 提票时间
// TPID 提票人工号
// BACKTICKET 施修部位
// BACKTIME 回票时间
// BACKID 回票人工号
// TPIDR 提票人姓名
// JT6_SXFF 施修方法
// JT6_GZMS 故障描述
// BACKIDR 施修人姓名
// JT6_FXJY 分析建议
// ZT=0-未施修 1-已施修 3-未复检 4-已复检 5-复检退回
holder.tv_busx.setText(bean.getLOCTYPE());
holder.tv_busnumber.setText(bean.getLOCNO());
holder.tv_1.setText("故障来源:" + bean.getNATURE());
holder.tv_2.setText("故障描述:" + bean.getJT6_GZMS());
holder.tv_3.setText("故障建议:" + bean.getJT6_FXJY());
holder.tv_5.setText("提票时间:" + bean.getTPTIME());
// holder.tv_7.setText("状态:" + bean.getGZ());
holder.tv_6.setText("提票人:" + bean.getTPIDR());
// holder.tv_6.setText("回票时间:" + bean.getBACKTIME());
// holder.tv_7.setText("回票人工号:" + bean.getBACKID());
holder.tv_7.setText("施修人:" + bean.getBACKIDR());
holder.tv_8.setText("施修部位:" + bean.getBACKTICKET());
holder.tv_9.setText("施修方法:" + bean.getJT6_SXFF());
if (tags[position] == 0) {
holder.btn_hp.setVisibility(View.GONE);
}else {
holder.btn_hp.setVisibility(View.VISIBLE);
}
map.put("" + position, holder.btn_hp);
// holder.tv_12.setText("故障建议:" + bean.getJT6_FXJY());
if (!bean.getZT().equals("")) {
if (bean.getZT().equals("0")) {
holder.tv_4.setText("状态:未施修");
} else if (bean.getZT().equals("1")) {
holder.tv_4.setText("状态:已施修");
} else if (bean.getZT().equals("2")) {
holder.tv_4.setText("状态:转临修");
} else if (bean.getZT().equals("3")) {
holder.tv_4.setText("状态:未复检 ");
} else if (bean.getZT().equals("4")) {
holder.tv_4.setText("状态:已复检");
} else if (bean.getZT().equals("5")) {
holder.tv_4.setText("状态:复检退回");
}else if (bean.getZT().equals("6")) {
holder.tv_4.setText("状态:重修");
}
}
if (onClickListener != null) {
holder.btn_hp.setOnClickListener(onClickListener);
holder.btn_hp.setTag(bean);
}
return convertView;
}
static class ViewHolder {
TextView tv_busx, tv_busnumber, tv_1, tv_2, tv_3, tv_4, tv_5, tv_6,
tv_7, tv_8, tv_9, tv_10, tv_11, tv_12,textview_backcolor;
Button btn_hp;
public ViewHolder(View view) {
tv_busx = (TextView) view.findViewById(R.id.tv_busx);
tv_busnumber = (TextView) view.findViewById(R.id.tv_busnumber);
tv_1 = (TextView) view.findViewById(R.id.tv_1);
tv_2 = (TextView) view.findViewById(R.id.tv_2);
tv_3 = (TextView) view.findViewById(R.id.tv_3);
tv_4 = (TextView) view.findViewById(R.id.tv_4);
tv_5 = (TextView) view.findViewById(R.id.tv_5);
tv_6 = (TextView) view.findViewById(R.id.tv_6);
// btn_t = (Button) view.findViewById(R.id.btn_t);
tv_7 = (TextView) view.findViewById(R.id.tv_7);
tv_8 = (TextView) view.findViewById(R.id.tv_8);
textview_backcolor = (TextView) view.findViewById(R.id.textview_backcolor);
btn_hp = (Button) view.findViewById(R.id.btn_hp);
tv_7.setVisibility(View.GONE);
tv_4.setVisibility(View.VISIBLE);
tv_8.setVisibility(View.VISIBLE);
tv_9 = (TextView) view.findViewById(R.id.tv_9);
tv_9.setVisibility(View.VISIBLE);
textview_backcolor.setVisibility(View.VISIBLE);
// tv_10= (TextView) view.findViewById(R.id.tv_10);
// tv_11 = (TextView) view.findViewById(R.id.tv_11);
// tv_12 = (TextView) view.findViewById(R.id.tv_12);
}
}
public void setOnClickListener(View.OnClickListener onClickListener) {
this.onClickListener = onClickListener;
}
}
listview 只有一条数据时getview()运行两次
layout_width设为了wrap_content
http://blog.csdn.net/weiwosuoai/article/details/50404235
##分割线设置
在drawable 创建分割线的布局文件:
list_item_divider.xml:
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetLeft="50dp"
android:drawable="@color/colorAccent">
</inset>
#自定义适配器
public class Student {
private String name;
private String age;
private String sex;
private String hobby;
private int image;
/**
*
* @param name
* @param age
* @param sex
* @param hobby
*/
public Student(String name, String age,String sex, String hobby,int image){
this.name=name;
this.age=age;
this.sex=sex;
this.hobby=hobby;
this.image=image;
}
public void setImage(int image) {
this.image = image;
}
public int getImage() {
return image;
}
public void setName(String name) {
this.name = name;
}
public void setAge(String age) {
this.age = age;
}
public void setSex(String sex) {
this.sex = sex;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
public String getName() {
return name;
}
public String getAge() {
return age;
}
public String getSex() {
return sex;
}
public String getHobby() {
return hobby;
}
}
private ListView mListView;
private List<Student> mData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listview);
mListView = (ListView) findViewById(R.id.listview_list);
LayoutInflater inflater=getLayoutInflater();
initData();//必须的先传数据才能传值
StudentAdapter adapter=new StudentAdapter(inflater,mData);
mListView.setAdapter(adapter);
}
private void initData() {
mData=new ArrayList<>();
Student zhangsan=new Student("张三","20","女","睡觉",R.mipmap.liyifei);
Student lisi=new Student("李四","21","男","打篮球",R.mipmap.liyifei);
Student wangwu=new Student("王五","22","女","唱歌",R.mipmap.liyifei);
Student zhaoliu=new Student("赵六","23","男","喝酒",R.mipmap.liyifei);
mData.add(zhangsan);
mData.add(lisi);
mData.add(wangwu);
mData.add(zhaoliu);
}
####LisetView布局
divider 设置分割线的颜色和高度
<?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">
<ListView
android:id="@+id/listview_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@color/red"
android:dividerHeight="1dp"></ListView>
</LinearLayout>
####ListView加载的模板
<?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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
android:id="@+id/image_picture"
android:layout_width="100dp"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/textview_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="姓名"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="15dp"
android:orientation="vertical">
<TextView
android:id="@+id/textview_age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="年龄"/>
<TextView
android:id="@+id/textview_sex"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="性别"/>
</LinearLayout>
<TextView
android:id="@+id/textview_hobby"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="爱好"/>
</LinearLayout>
</LinearLayout>
private ListView mListView;
private List<Student> mData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listview);
mListView = (ListView) findViewById(R.id.listview_list);
LayoutInflater inflater=getLayoutInflater();
initData();//必须的先传数据才能传值
StudentAdapter adapter=new StudentAdapter(inflater,mData);
mListView.setAdapter(adapter);
}
private void initData() {
mData=new ArrayList<>();
Student zhangsan=new Student("张三","20","女","睡觉",R.mipmap.liyifei);
Student lisi=new Student("李四","21","男","打篮球",R.mipmap.liyifei);
Student wangwu=new Student("王五","22","女","唱歌",R.mipmap.liyifei);
Student zhaoliu=new Student("赵六","23","男","喝酒",R.mipmap.liyifei);
mData.add(zhangsan);
mData.add(lisi);
mData.add(wangwu);
mData.add(zhaoliu);
}
ListView 的缓冲区
public View getView(int position, View convertView, ViewGroup parent) {
Student student=mData.get(position);
ViewHolder vh=null;
if (convertView==null) {
vh=new ViewHolder();
convertView=mInflater.inflate(R.layout.activity_simpleadapter,null);
vh. mTextView_name = (TextView) convertView.findViewById(R.id.textview_name);
vh. mTextView_age = (TextView) convertView.findViewById(R.id.textview_age);
vh. mTextView_sex = (TextView) convertView.findViewById(R.id.textview_sex);
vh. mTextView_hobby = (TextView) convertView.findViewById(R.id.textview_hobby);
vh. mImageView_picture = (ImageView) convertView.findViewById(R.id.image_picture);
convertView.setTag(vh);
}else{
vh=(ViewHolder)convertView.getTag();
}
vh.mTextView_name.setText(student.getName());
vh.mTextView_age.setText(student.getAge());
vh.mTextView_sex.setText(student.getSex());
vh.mTextView_hobby.setText(student.getHobby());
vh.mImageView_picture.setImageResource(student.getImage());
return convertView;
}
class ViewHolder{
TextView mTextView_name;
TextView mTextView_age;
TextView mTextView_sex;
TextView mTextView_hobby;
ImageView mImageView_picture;
}
}
####点击事件
public class FruitAdapter extends BaseAdapter{
private LayoutInflater mInflater;
private List<Fruit> mData;
private boolean [] mManagerAllCheckBox;
public FruitAdapter(LayoutInflater inflater,List<Fruit> data){
mInflater=inflater;
mData=data;
mManagerAllCheckBox=new boolean[data.size()];
}
public void isChoose(int position){
mManagerAllCheckBox[position]=!mManagerAllCheckBox[position];//选中选不中
notifyDataSetChanged();
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder vh=null;
if (convertView==null){
vh=new ViewHolder();
convertView=mInflater.inflate(R.layout.activity_fruit,null);
vh.checkBox= (CheckBox) convertView.findViewById(R.id.checkbox_fruit);
vh.imageView= (ImageView) convertView.findViewById(R.id.image_fruit);
vh.textView= (TextView) convertView.findViewById(R.id.editext_apple);
convertView.setTag(vh);
}else{
vh= (ViewHolder) convertView.getTag();
}
Fruit fruit=mData.get(position);
vh.textView.setText(fruit.getName());
vh.imageView.setImageResource(fruit.getImg());
vh.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Log.d("Myfruit","选择框变化"+ isChecked);
mManagerAllCheckBox[position]=isChecked;//选中点击
notifyDataSetChanged();//刷新界面
}
});
vh.checkBox.setChecked(mManagerAllCheckBox[position]);//点击选中 的是下面不会出现乱选
return convertView;
}
class ViewHolder{
CheckBox checkBox;
ImageView imageView;
TextView textView;
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical">
<CheckBox
android:id="@+id/checkbox_fruit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"//取消checkbox的集中点击
android:text="买水果"/>
<ImageView
android:id="@+id/image_fruit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/liyifei"/>
<TextView
android:id="@+id/editext_apple"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="水果种类"/>
</LinearLayout>
public class MySimpleAdapter extends Activity{
private ListView mListView;
private List<Fruit> mData;
private FruitAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listview);
mListView= (ListView) findViewById(R.id.listview_list);
LayoutInflater inflater=getLayoutInflater();
initData();
adapter=new FruitAdapter(inflater,mData);
mListView.setAdapter(adapter);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
adapter.isChoose(position);
}
});
}
private void initData() {
mData=new ArrayList<>();
for (int i=0;i<5;i++) {
Fruit apple = new Fruit("苹果", R.mipmap.apple);
Fruit bananer = new Fruit("香蕉", R.mipmap.bananer);
Fruit caomei = new Fruit("草莓", R.mipmap.caomei);
mData.add(apple);
mData.add(bananer);
mData.add(caomei);
}
}
}