CardView 同时点击事件和焦点

CardView click event and focus at same time

我有一个 CardView 带有自定义选择器,其中包括焦点状态为 true

<android.support.v7.widget.CardView
    android:id="@+id/cvColor"
    android:layout_width="45dp"
    android:layout_height="45dp"
    android:layout_gravity="center"
    android:layout_marginBottom="4dp"
    android:layout_marginLeft="5dp"
    android:layout_marginTop="2dp"
    android:foreground="@drawable/card_color_size"
    android:minHeight="50dp"
    android:visibility="gone"
    app:cardCornerRadius="3dp"
    app:cardElevation="4dp"
    app:cardPreventCornerOverlap="false"
    app:cardUseCompatPadding="true" >

我的需要是,当我点击卡片时,它也应该被点击和聚焦。所以我做了这样的事情。

@Override
    public void onBindViewHolder(final ViewHolderCard1 viewHolder,
            final int position) {
        viewHolder.size.setVisibility(View.VISIBLE);
        viewHolder.tvSize.setText(size.get(position).get("size"));
        viewHolder.size.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                posSize = position;
                Toast.makeText(getApplicationContext(), "" + posSize,
                        Toast.LENGTH_SHORT).show();
                viewHolder.size.setFocusableInTouchMode(true);
            }
        });
    }

现在,当我单击一次 RecycleView 的项目时,它工作正常,Toast 和焦点同时发生。

但是当我点击下一个项目时,它就像第一次点击卡片一样执行点击事件,第二次它获得焦点。

有人知道我该怎么做吗?

Try this code.
@Override
public void onBindViewHolder(final ViewHolderCard1 viewHolder,
         int position) {
    viewHolder.size.setVisibility(View.VISIBLE);
    viewHolder.tvSize.setText(size.get(position).get("size"));
    viewHolder.size.setOnClickListener(new Listener(position, viewHolder.size));
}
class Listener implements OnClickListener {
    private int position;
    private ImageView imageView;
    private CardView cardview;

    Listener(int position,  CardView cardview) {
        this.position = position;
        this.imageView = imageView;
        this.data = data;
    }

    @SuppressLint("UseValueOf")
    @Override
    public void onClick(View v) {

     posSize = position;
            Toast.makeText(getApplicationContext(), "" + posSize,
                    Toast.LENGTH_SHORT).show();
           CardView.setFocusableInTouchMode(true);  

    }
}

这几天我解决了,如果有人遇到这个问题,我会在这里发布我的答案吗?

SparseBooleanArray 在我的案例中成功了。

首先在你的适配器Class中声明SparseBooleanArray。并在适配器 class.

的构造函数中初始化它
private ArrayList<HashMap<String, String>> size;
public final SparseBooleanArray selectedItems;

public Size(ArrayList<HashMap<String, String>> title) {
    this.size = title;
    selectedItems = new SparseBooleanArray(size.size());
}

现在我使用setSelected来聚焦选定的卡片。在 onBindViewHolder 内(如果您使用 BaseAdapter,则在 getView 内)。

viewHolder.size.setSelected(selectedItems.get(position));
viewHolder.size.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        posSize = position;

        if (selectedItems.size() == 0) {
            selectedItems.put(position, true);
        } else if (selectedItems.size() > 0) {
            selectedItems.clear();
            selectedItems.put(position, true);
        }
        notifyDataSetChanged();
    }
});

编码愉快。