Android 如何使ListView中的标题视图不可选择?

Android 如何使ListView中的标题视图不可选择?,android,listview,Android,Listview,我正在创建自定义列表视图,如中所述 这是我的项目界面 公共接口项{ public int getViewType(); 公共视图getView(充气机、视图转换视图); } 这是我的头等舱 public class Header implements Item { private final String name; public Header(String name) { this.name = name; } @Override

我正在创建自定义列表视图,如中所述

这是我的项目界面

公共接口项{
public int getViewType();
公共视图getView(充气机、视图转换视图);
}

这是我的头等舱

public class Header implements Item {

    private final String name;

    public Header(String name) {
        this.name = name;
    }

    @Override
    public int getViewType() {
        return TwoTextArrayAdapter.rowType.HEADER_ITEM.ordinal();
    }

    @Override
    public View getView(LayoutInflater inflater, View convertView) {
        View rootView;
        if (convertView == null) {
            rootView = (View) inflater.inflate(R.layout.nav_header, null);
        } else {
            rootView = convertView;
        }

        TextView text = (TextView) rootView.findViewById(R.id.separator);
        text.setText(name);

        rootView.setEnabled(false);

        return rootView;
    }
这是我的列表类

public class ListItem implements Item {

    private final String item;

    public ListItem(String item) {
        this.item = item;
    }

    @Override
    public int getViewType() {
        return TwoTextArrayAdapter.rowType.LIST_ITEM.ordinal();
    }

    @Override
    public View getView(LayoutInflater inflater, View convertView) {
        View rootView;

        if (convertView == null) {
            rootView = (View) inflater.inflate(android.R.layout.simple_list_item_activated_1, null);
        } else {
            rootView = convertView;
        }

        TextView text = (TextView) rootView.findViewById(android.R.id.text1);
        text.setText(item);

        return rootView;
    }
}
我还使用了从
ArrayAdapter

public class TwoTextArrayAdapter extends ArrayAdapter<Item> {

private LayoutInflater mInflater;

public enum rowType {
    LIST_ITEM, HEADER_ITEM
}

public TwoTextArrayAdapter(Context context, List<Item> items) {
    super(context, 0, items);
    mInflater = LayoutInflater.from(context);
}

@Override
public int getViewTypeCount() {
    return rowType.values().length;
}

@Override
public int getItemViewType(int position) {
    return getItem(position).getViewType();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    return getItem(position).getView(mInflater, convertView);
}
公共类TwoTextArrayAdapter扩展了ArrayAdapter{
私人停车场;
公共枚举行类型{
列表项、标题项
}
公共TwoTextArrayAdapter(上下文、列表项){
超级(上下文,0,项);
mInflater=LayoutInflater.from(上下文);
}
@凌驾
public int getViewTypeCount(){
返回rowType.values().length;
}
@凌驾
public int getItemViewType(int位置){
返回getItem(position).getViewType();
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
返回getItem(位置).getView(mInflater,convertView);
}
}

这就是我使用它的方式

mDrawerListView = (ListView) inflater.inflate(R.layout.fragment_navigation_list, container, false);
        mDrawerListView.setFitsSystemWindows(true);

        mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                selectItem(position);
            }
        });

        List<Item> services = new ArrayList<Item>();
        services.add(new Header("Call Management"));
        services.add(new ListItem("Service 01"));
        services.add(new ListItem("Service 02"));

        TwoTextArrayAdapter adapter = new TwoTextArrayAdapter(getActivity(), services);
        mDrawerListView.setAdapter(adapter);
mDrawerListView=(ListView)充气器。充气(R.layout.fragment\u导航\u列表,容器,false);
mDrawerListView.setFitsSystemWindows(true);
mDrawerListView.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
选择项目(位置);
}
});
列表服务=新的ArrayList();
添加(新标题(“呼叫管理”);
添加(新列表项(“服务01”));
添加(新列表项(“服务02”));
TwoTextArrayAdapter=newTwoTextArrayAdapter(getActivity(),services);
mDrawerListView.setAdapter(适配器);
我的问题是,当我为该
列表视图设置
onClickListener()
时,所有项目,包括标题项目,都被视为可单击项目。我需要确保Android忽略标题项,并允许用户仅单击
ListItem
中的项

我怎么做


谢谢

覆盖在
TwoTextArrayAdapter
中启用。比如说

@Override
public boolean isEnabled(int position) {
    return getItem(position).getViewType() != HeaderType ;
}
@Override
public boolean isEnabled(int position) {
    if (getItem(position).getViewType() == HeaderType)
        return false;
    return super.isEnabled(position);
}

documnetation

更好的是,当您将标题添加到listview时,将其添加如下:

listView.addHeaderView(view,null,false);

黑带的修改

已启用

布尔值isEnabled(整数位置)

如果指定位置的项目不是分隔符,则返回true。 (分隔符是不可选择、不可单击的项目)。结果是 如果位置无效,则未指定。数组索引边界外的sexception 在这种情况下,应该抛出快速失败


TwoTextArrayAdapter
中启用覆盖。比如说

@Override
public boolean isEnabled(int position) {
    return getItem(position).getViewType() != HeaderType ;
}
@Override
public boolean isEnabled(int position) {
    if (getItem(position).getViewType() == HeaderType)
        return false;
    return super.isEnabled(position);
}

isEnabled:如果指定位置的项不是分隔符,则返回true。-对于分隔符,这将错误地返回
true
,因为
分隔符
是-not-a
HeaderType
。这适用于我。。。我检查了适配器覆盖第一个b/c,这就是为什么我得到了一个
ExpandableListAdapter
来执行此操作(isChildSelectable(int-groupPos,int-childPos))。