CardView点击事件并同时关注

时间:2016-01-01 09:56:49

标签: android android-cardview

我有一个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和焦点同时发生。

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

任何人都知道我该怎么办?

2 个答案:

答案 0 :(得分:0)

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);  

    }
}

答案 1 :(得分:0)

我解决了这几天我是否在这里张贴我的答案,如果任何一个人解决了这个问题。

SparseBooleanArray在我的案例中完成了这个伎俩。

首先在适配器类中声明SparseBooleanArray。并在适配器类的构造函数中初始化它。

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内部(或getView,以防您使用BaseAdapter)。

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();
    }
});

快乐编码。