ListView

####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);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值