安卓二级列表的适配器 带优化的 解决二级列表里添加了自定义view以后不能点击展开的问题

来源:互联网 发布:mac os 配置 postman 编辑:程序博客网 时间:2024/06/14 06:35
在自定义的item项layout中加入
dandroid:descendantFocusability="blocksDescendants"
开发中很常见的一个问题,项目中的listview不仅仅是简单的文字,常常需要自己定义listview,自己的Adapter去继承BaseAdapter,在adapter中按照需求进行编写,问题就出现了,可能会发生点击每一个item的时候没有反应,无法获取的焦点。原因多半是由于在你自己定义的Item中存在诸如ImageButton,Button,CheckBox等子控件(也可以说是Button或者Checkable的子类控件),此时这些子控件会将焦点获取到,所以常常当点击item时变化的是子控件,item本身的点击没有响应。
    这时候就可以使用descendantFocusability来解决啦,API描述如下:
android:descendantFocusability
Defines the relationship between the ViewGroup and its descendants when looking for a View to take focus.
Must be one of the following constant values.
 
该属性是当一个为view获取焦点时,定义viewGroup和其子控件两者之间的关系。
属性的值有三种:
        beforeDescendants:viewgroup会优先其子类控件而获取到焦点
        afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
        blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
 
通常我们用到的是第三种,即在Item布局的根布局加上android:descendantFocusability=”blocksDescendants”的属性就好了
下面是适配器:适用于安卓二级列表import android.content.Context;import android.view.View;import android.view.ViewGroup;import android.widget.BaseExpandableListAdapter;import android.widget.CheckBox;import android.widget.TextView;import com.bwei.erjigou.Bean.Goodsbean;import com.bwei.erjigou.Bean.Groupbean;import com.bwei.erjigou.R;import java.util.List;/** * Created by 31962 on 2017/10/24. */public class MyElvAdapter extends BaseExpandableListAdapter { private List<Groupbean> grouplist; private List<List<Goodsbean>> childlist; private Context context; public MyElvAdapter(List<Groupbean> grouplist, List<List<Goodsbean>> childlist, Context context) { this.grouplist = grouplist; this.childlist = childlist; this.context = context; } @Override public int getGroupCount() { return grouplist.size(); } @Override public int getChildrenCount(int groupPosition) { return childlist.get(groupPosition).size(); } @Override public Object getGroup(int groupPosition) { return grouplist.get(groupPosition); } @Override public Object getChild(int groupPosition, int childPosition) { return childlist.get(groupPosition).get(childPosition); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public boolean hasStableIds() { return false; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { GroupViewholder groupViewholder ; if(convertView == null){ groupViewholder = new GroupViewholder(); convertView = View.inflate(context, R.layout.groupitem, null); groupViewholder.cb_group = convertView.findViewById(R.id.cb_group); groupViewholder.tv_group = convertView.findViewById(R.id.tv_group); convertView.setTag(groupViewholder); }else{ groupViewholder = (GroupViewholder) convertView.getTag(); } groupViewholder.cb_group.setChecked(grouplist.get(groupPosition).ischecked); groupViewholder.tv_group.setText(grouplist.get(groupPosition).groupname); return convertView; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { ChildViewholder childviewholder ; if(convertView == null){ childviewholder = new ChildViewholder(); convertView = View.inflate(context,R.layout.childitem,null); childviewholder.cb_child = convertView.findViewById(R.id.cb_child); childviewholder.tv_child = convertView.findViewById(R.id.tv_child); convertView.setTag(childviewholder); }else { childviewholder = (ChildViewholder) convertView.getTag(); } childviewholder.cb_child.setChecked(childlist.get(groupPosition).get(childPosition).ischecked); childviewholder.tv_child.setText(childlist.get(groupPosition).get(childPosition).goodsname); return convertView; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } class GroupViewholder{ CheckBox cb_group; TextView tv_group; } class ChildViewholder{ CheckBox cb_child; TextView tv_child; }}