【问题标题】:How to make Header View in ListView unselectable?如何使 ListView 中的标题视图无法选择?
【发布时间】:2014-05-06 11:55:08
【问题描述】:

我正在创建一个自定义列表视图,如 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;
    }
}

我也在使用从ArrayAdapter扩展而来的TwoTextArrayAdapter

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);

我的问题是,当我为 ListView 设置 onClickListener() 时,所有项目,包括标题项目都被视为可点击项目。我需要确保 Android 忽略 Header 项目并允许用户仅单击 ListItem 中的项目。

我该怎么做?

谢谢

【问题讨论】:

    标签: android listview


    【解决方案1】:

    TwoTextArrayAdapter 中覆盖 isEnabled。比如

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

    here文档

    【讨论】:

    • isEnabled如果指定位置的项目不是分隔符,则返回 true。 - 这将错误地返回 @ 987654324@ 用于分隔符,因为 separator is-not-a HeaderType.
    【解决方案2】:

    更好的是,当您将标题添加到列表视图时,可以这样添加:

    listView.addHeaderView(view,null,false);
    

    【讨论】:

    • 这对我有用...我首先检查了适配器覆盖 b/c 这就是我得到 ExpandableListAdapter 的方法 (isChildSelectable(int groupPos, int childPos))。
    【解决方案3】:

    Blackbeltanswer的修改

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-12-20
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多