我正在创建自定义列表视图,如Android ListView headers中所述。
这是我的项目界面
public interface Item {
public int getViewType();
public View getView(LayoutInflater inflater, View convertView);
}
这是我的Header类
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;
}
}
此外,我正在使用从TwoTextArrayAdapter
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);
}
}
这是我使用它的方式
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);
我的问题是当我为onClickListener()
设置ListView
时,所有项目(包括标题项目)都被视为可点击项目。我需要确保Android 忽略标题项,并允许用户仅点击ListItem
中的项目。
我该怎么做?
谢谢
答案 0 :(得分:2)
在TwoTextArrayAdapter
内覆盖isEnabled。例如
@Override
public boolean isEnabled(int position) {
return getItem(position).getViewType() != HeaderType ;
}
here documnetation
答案 1 :(得分:1)
更好的是,当您将标题添加到列表视图时,请按以下方式添加:
listView.addHeaderView(view,null,false);
答案 2 :(得分:0)
对 Blackbelt 的answer
的修改isEnabled
boolean isEnabled(int position)
如果指定位置的项目不是分隔符,则返回true。 (分隔符是不可选择的,不可点击的项目)。结果是 如果位置无效,则未指定。 ArrayIndexOutOfBoundsException 在那种情况下应该抛出快速失败。
在TwoTextArrayAdapter
内覆盖isEnabled。例如
@Override
public boolean isEnabled(int position) {
if (getItem(position).getViewType() == HeaderType)
return false;
return super.isEnabled(position);
}