5

我有一个填充了自定义 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 Theme)

当我尝试将 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 的默认样式的同时获得高光颜色吗?

4

3 回答 3

3

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

此外,这里已经描述了突出显示问题:Android listview no longer highlight selection onclick

于 2013-08-08T17:44:14.723 回答
0

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

android:addStatesFromChildren="true"

或者,在代码调用中:

convertView.setAddStatesFromChildren(true);

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

于 2013-08-08T18:03:33.597 回答
0

您可以保持突出显示行为并拥有多个OnClickListener,如果您

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

为此,请添加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()的是,这只会调用监听器,不会执行任何关联的点击操作,例如报告可访问性事件。

于 2017-07-18T21:07:32.523 回答