android - 单击时突出显示 RecyclerView 中的选定项目

标签 android android-recyclerview ontouchlistener

我有一个RecyclerView,我研究出了如何在单击项目时突出显示项目,并按照他们所说的那样here .

但这将突出显示被点击后的项目。我想要类似普通 ListView 的东西。因此,单击时应突出显示该项目。这就是我使用 OnTouchListener 的原因。

@Override
    public boolean onTouch(View v, MotionEvent event) {
        int adapterPosition = getAdapterPosition();
        if (adapterPosition == RecyclerView.NO_POSITION) return false;

        adapter.notifyItemChanged(adapter.getSelectedPos());
        adapter.setSelectedPos(adapterPosition);
        adapter.notifyItemChanged(adapter.getSelectedPos());

        if(event.getAction() == MotionEvent.ACTION_UP){
            clicks.onItemSelected(adapterPosition);
            return true;
        }

        return false;
    }

但我的问题是,我还想知道用户何时向上移动手指,这样我就可以在单击它时执行我想要的操作。但不幸的是这不起作用。我怎样才能实现这个目标?

最佳答案

您提供的代码,我认为仅突出显示所选项目不是正确的方法。您的代码将多次通知不必要的项目。

这可以通过可绘制选择器来完成。因为有many answers 哪个指南,如何使用选择器背景。

但这就是问题

selectableItemBackground 仅适用于触摸,不适用于选择。所以这里有一个技巧。

我们将前景设置为 ?selectableItemBackground 并在同一 View 上设置自定义背景选择器。

我创建了一个满足您要求的示例。

  • 首先创建一个背景选择器,如果停用则设置透明颜色,如果激活则设置颜色。

activated_color_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_activated="true">
        <color android:color="@color/colorPrimary"/>
    </item>
    <item>
        <color android:color="@android:color/transparent"/>
    </item>
</selector>
  • 使用此选择器作为您的项目的背景。还将前景设置为 ?selectableItemBackground

行.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ll"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:background="@drawable/activated_color_selector"
    android:foreground="?selectableItemBackground">

    // other views inside

</LinearLayout>
  • 您的模型类将保存选定的 bool 值。

模型.java

public class BaseModel extends BaseObservable {
    private boolean selected;
    // setter getter
}
  • 将模型选定的字段附加到 View 。单击时还会反转所选字段。

RecyclerView 适配器内部

@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
    final BaseModel model = list.get(position);
    holder.linearLayout.setActivated(model.isSelected());
    holder.linearLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            model.setSelected(!model.isSelected());
            notifyItemChanged(position);
        }
    });
}

全部完成!

关于android - 单击时突出显示 RecyclerView 中的选定项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51949120/

相关文章:

java - 在 imageview 中播放动画 GIF 图像文件

Android:RecyclerView 不显示 fragment 中的列表项

java - Android 点击并按住删除项目

java - 从 RecyclerView 和 Realm DB 中删除项目

Android:如何确定触摸事件在 TextView 中的位置的字符索引?

java - onTouchListener 一个ImageView需要点击两次才能起作用,另一个只需点击一次

java - 服务在应用程序关闭时停止,而以前没有

java - 回收站 View 不显示 Youtube 视频

android - 使用字符串而不是字符串传递给适配器

android - RecyclerView 右滑添加图标