【问题标题】:ListView default background selector doesn't workListView 默认背景选择器不起作用
【发布时间】:2019-03-03 00:26:58
【问题描述】:

我正在尝试解决列表视图中默认背景选择器的问题。

我正在使用具有默认样式的 ListView。列表项包含一些 TextView 和一个 ImageButton。当图像按钮不可见时(使用适配器将可见性设置为不可见),背景选择器效果很好(有一个点击动画)。但是,当 ImageButton 可见时,单击项目(不是按钮)时没有 onclick 动画..

列表项:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
>

<TextView
    android:id="@+id/time"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="10:20:30"
    android:layout_centerVertical="true"/>

<TextView
    android:id="@+id/type"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Title"
    android:layout_alignParentTop="true"
    android:layout_toEndOf="@+id/time"
    android:layout_marginStart="15dp"
    android:layout_toStartOf="@+id/openMapButton"
    android:textStyle="bold"/>

<TextView
    android:id="@+id/body"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Long long bodylong bodylong bodylong bodylong bodylong bodylong bodylong body"
    android:layout_below="@+id/type"
    android:layout_alignStart="@id/type"
    android:layout_toStartOf="@+id/openMapButton"
    android:ellipsize="end"
    android:maxLines="2"
    />

<ImageButton
    android:id="@+id/openMapButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/open_map"
    android:background="@android:color/transparent"
    android:padding="4dp"
    android:layout_alignParentEnd="true"
    android:layout_centerVertical="true"/>

列表视图:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".events.EventsHistoryFragment">

<ListView
    android:id="@android:id/list"
    tools:listitem="@layout/notification_list_item"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

适配器:

    public class EventsAdapter extends CursorAdapter {

    public EventsAdapter(Context context, Cursor c, boolean autoRequery) {
        super(context, c, autoRequery);
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        View view = LayoutInflater.from(context).inflate(R.layout.notification_list_item, parent, false);

        EventViewHolder viewHolder = new EventViewHolder();
        viewHolder.time = (TextView) view.findViewById(R.id.time);
        viewHolder.type = (TextView) view.findViewById(R.id.type);
        viewHolder.body = (TextView) view.findViewById(R.id.body);
        viewHolder.openMapButton = (ImageButton) view.findViewById(R.id.openMapButton);
        viewHolder.openMapButtonListener = new ShowMapButtonClickListener();
        viewHolder.openMapButton.setOnClickListener(viewHolder.openMapButtonListener);

        view.setTag(viewHolder);

        return view;
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {

        EventViewHolder viewHolder = (EventViewHolder) view.getTag();

        long timestamp = cursor.getLong(EventData.TIMESTAMP_COLUMN_ID);
        String type = cursor.getString(EventData.TYPE_COLUMN_ID);
        String body = cursor.getString(EventData.BODY_COLUMN_ID);
        double latitude = cursor.getDouble(EventData.LOCATION_LATITUDE_COLUMN_ID);
        double longitude = cursor.getDouble(EventData.LOCATION_LONGITUDE_COLUMN_ID);
        String humanReadableType = ServiceEvents.getReadableEventName(context, type);

        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
        Date date = new Date(timestamp);

        viewHolder.time.setText(sdf.format(date));
        viewHolder.type.setText(humanReadableType);
        viewHolder.body.setText(body);
        if(latitude == ServiceEvents.UNKNOWN_COORIDATE) {
            viewHolder.openMapButton.setVisibility(View.INVISIBLE);
        } else {
            viewHolder.openMapButton.setVisibility(View.VISIBLE);
            viewHolder.openMapButtonListener.bind(context, latitude, longitude, humanReadableType);
        }

    }
}

【问题讨论】:

    标签: android listview


    【解决方案1】:

    android列表项的默认行为由选择器决定 ?android:attr/selectableItemBackground 所以你的 ListItem 的 RelativeLayout 应该是:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:paddingTop="5dp"
    android:paddingBottom="5dp"
    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
    android:background="?android:attr/selectableItemBackground"
    >
    

    注意最后一个属性 android:background="?android:attr/selectableItemBackground"

    【讨论】:

    • 它没有帮助。没有改变。当图像按钮可见时,背景不动画
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 2014-03-22
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    相关资源
    最近更新 更多