【问题标题】:Multi select CardView in ListView在 ListView 中多选 CardView
【发布时间】:2016-02-26 11:41:03
【问题描述】:

我想多选自定义ListView行,我使用CardView设计它并且所有事件都发生在这张卡上,我想在用户长按卡时实现Contextual Action bar 'CAB',实际上我做到了但可以't change the row color state when selected like this, I used the code from this answer:

并使用此代码使CardView 可检查:

    public class CheckableCard extends CardView implements Checkable {
    private boolean mChecked;

    private final static int[] CHECKED_STATE_SET = {
        android.R.attr.state_checked
    };

    public CheckableCard(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected int[] onCreateDrawableState(int extraSpace) {
        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
        if (isChecked()) {
            mergeDrawableStates(drawableState, CHECKED_STATE_SET);
        }
        return drawableState;
    }

    @Override
    public void toggle() {
        setChecked(!mChecked);
    }

    @Override
    public boolean isChecked() {
        return mChecked;
    }

    @Override
    public void setChecked(boolean checked) {
        if (mChecked != checked) {
            mChecked = checked;
            refreshDrawableState();
        }
    }
}

然后在OnLongClickListener 中的CardView 中检查:

cardView.setChecked(true);

但没有任何效果!

我也不知道如何多选它,因为它正常ListView 行我们使用setMultiChoiceModeListener 但是当事件发生在卡片未列出时我不知道如何实现。

我是初学者,需要帮助。

【问题讨论】:

  • 很遗憾,检查状态对 CardView 没有任何影响。但是,现在我在我的应用程序上工作(这里:play.google.com/store/apps/details?id=com.lb.app_manager)来更新它(目前它有假卡),这将使用“已选择”字段来知道它已被选中,并相应地设置背景颜色。这不一样,但也许对你来说就足够了。关于多选本身,我已经存储了哪些项目被选中,以便在 getView 中您将能够相应地更新它们。
  • @androiddeveloper 你是用this 回答来实现选择器效果的吗?,也请你发一下代码sn-p,因为我不知道如何实现。
  • 仅适用于前台,且仅适用于未选中状态(即默认和点击)。我现在在办公室,我的应用是在业余时间完成的。我将发布代码。适配器也需要它吗?适配器只调用 setSelected(_selectedItems.contains(getItem(pos).someId)) 或类似的东西。
  • 是的,请发布完整的 sn-p,因为我是初学者,这是我第一次处理这个问题。
  • 好吧,我最近才这样做,但这真的取决于你是否需要。

标签: android multi-select android-cardview


【解决方案1】:

好的,这就是我所做的:

SelectableCardView

public class SelectableCardView extends CardView
  {
  private int _unselectedBackgroundColor;
  private int _selectedBackgroundColor;
  private boolean _isSelectedble;

  public SelectableCardView(Context context)
    {
    this(context,null);
    }

  public SelectableCardView(Context context,AttributeSet attrs)
    {
    this(context,attrs,0);
    }

  public SelectableCardView(Context context,AttributeSet attrs,int defStyleAttr)
    {
    super(context,attrs,defStyleAttr);
    final Resources res=context.getResources();
    _selectedBackgroundColor=...
    _unselectedBackgroundColor=... // you could use cardview_light_background or cardview_dark_background for the default values here, depending on your theme
    }

  public void setSelectedBackgroundColor(@ColorInt int selectedBackgroundColor)
    {
    _selectedBackgroundColor=selectedBackgroundColor;
    }

  public void setUnselectedBackgroundColor(@ColorInt int unselectedBackgroundColor)
    {
    _unselectedBackgroundColor=unselectedBackgroundColor;
    }

  @Override
  public void setSelected(final boolean selected)
    {
    super.setSelected(selected);
    if(_isSelectedble)
      setCardBackgroundColor(isSelected()?_selectedBackgroundColor:_unselectedBackgroundColor);
    }

  public void setSelectedble(final boolean selectedble)
    {
    if(!selectedble)
      {
      super.setSelected(false);
      setCardBackgroundColor(_unselectedBackgroundColor);
      }
    _isSelectedble=selectedble;
    }
  }

用法:

<...SelectableCardView
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:clickable="true"
  android:foreground="@drawable/card_foreground"
  app:cardCornerRadius="@dimen/card_radius"
  app:cardElevation="4dp"
  app:contentPadding="10dp">
  ...

为了使卡片被选中,只需调用 setSelected(...) 即可。

这里没有魔术......

其余的代码和你给here的链接类似

【讨论】:

  • 非常感谢,我会实施它,看看它是否有效,如果没有,我会回复您。
猜你喜欢
  • 1970-01-01
  • 2018-03-08
  • 2021-10-18
  • 1970-01-01
  • 2016-12-01
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多