【问题标题】:Android ListView does not Highlight when a OnClickListener is set设置 OnClickListener 时,Android ListView 不突出显示
【发布时间】:2013-08-10 13:06:45
【问题描述】:

我有一个使用自定义 XML ListItems 填充的 ListView,这是 XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="?android:attr/listPreferredItemHeight"
                android:padding="6dip">
...
</RelativeLayout>

listView 在屏幕上正确显示,如果我单击或按住某个项目,它会变为蓝色(我正在使用 Holo Light 主题)

当我尝试将 OnClickListener 分配给视图时,问题就出现了,在扩展 BaseAdapter 的 Activity 中的 getView 内:

@Override
public View getView(int position, @Nullable View convertView, ViewGroup parent) {
    ...
    convertView = InflateUtils.inflate(mContext, R.layout.list_item);
    ...
    convertView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(mContext, "Test", 2000).show();
        }
    });
...
}

之后,列表项突出显示颜色不再显示,当我单击或按住列表项时,它的背景保持白色, 无论如何,onClickListener 工作正常。

您有什么建议可以在保持 HoloLight 的默认样式的同时获得高亮颜色吗?

【问题讨论】:

    标签: android user-interface android-listview


    【解决方案1】:

    你可以保持高亮行为并拥有多个OnClickListener,如果你

    1. 设置OnClickListener
    2. 禁用OnClickListener
    3. OnItemClickListener 调用OnClickListener

    为此,请将setClickable(false) 添加到您的代码中:

    @Override
    public View getView(int position, @Nullable View convertView, ViewGroup parent) {
        ...
        convertView = InflateUtils.inflate(mContext, R.layout.list_item);
        ...
        convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(mContext, "Test", 2000).show();
            }
        });
        // make non-clickable again, like before setting the OnClickListener
        convertView.setClickable(false);
        ...
    }
    

    并以编程方式调用监听器,例如:

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle)
    {
       final View view = inflater.inflate(R.layout.fragment_with_listview, container, false);
       final ListView your_listview = (ListView) view.findViewById(R.id.your_listview);
       // delegate to specific callbacks
       your_listview.setOnItemClickListener(new AdapterView.OnItemClickListener()
       {   public void onItemClick(AdapterView<?> parent, View view, int position, long id)
           {   view.callOnClick();
           }
       });
       ...
    }
    

    注意callOnClick() 的记录行为:

    直接调用任何附加的 OnClickListener。与performClick() 不同的是,这只会调用监听器,不会执行任何关联的点击操作,例如报告可访问性事件。

    【讨论】:

      【解决方案2】:

      将此添加到父RelativeLayout的布局属性中:

      android:addStatesFromChildren="true"
      

      或者,在代码调用中:

      convertView.setAddStatesFromChildren(true);
      

      在任何一种情况下,请确保子布局没有设置android:duplicateParentState 属性(并且不要调用setDuplicateParentState(true)),否则您将在运行时遇到异常。

      【讨论】:

      • 这对我不起作用,XML 部分。编程部分我无法测试,因为编译器抱怨 setAddStatesFromChildren 方法“不存在”。无论如何,为什么它应该起作用?
      【解决方案3】:

      您可能希望在ListView 本身上使用OnItemClickListener,而不是为项目视图使用单独的点击侦听器。

      另外,这里已经描述了高亮问题:Android listview no longer highlights selection onclick

      【讨论】:

      • 投反对票的人,愿意评论我的回答有什么问题吗?这样我们就能更接近真相。
      • 我没有,反正我对 OnItemClickListener 很好奇,你认为这会解决我的问题吗?使用单独的 OnClickListener 是否存在任何性能问题? - 我已经阅读了这个问题,但解决方案不是使用 HoloLight 样式,这是我必须的。
      • 好吧,如果您的项目相似,您可以使用一个侦听器并通过项目 ID 进行区分 - 一个对象而不是数百个对象。至于全息-您可以将全息与该答案中的解决方案一起使用,使用突出显示的背景称为 R.drawable.list_selector_holo_dark
      • 使用 OnItemClickListener 解决了这个问题,我的对象更少了,我的 Highlight 又回来了 :)
      猜你喜欢
      • 2014-11-11
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多