【问题标题】:Multiple items selection in an Android ListView with custom view具有自定义视图的 Android ListView 中的多个项目选择
【发布时间】:2014-06-07 18:13:03
【问题描述】:

我正在尝试在 Android 应用程序中实现一个 Android ListView 中的多项选择,以允许用户在操作模式的帮助下在一个操作中删除多行。

例如,我检查第一个监听长按的项目(在下面的例子中,contacts 是一个ListView):

@override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id)
{
  contacts.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
  contacts.setItemChecked(position, true);

  return true;
}

问题是,调用setItemChecked()方法后,getCheckedItemPositions()方法返回null,但是应该返回已经签入onItemLongClick()方法的item的位置没有?

我的ListView 的项目是用自定义视图制作的。所以我在网上读到我的自定义视图必须实现Checkable 接口。所以这里是我的自定义视图的主要容器:

public final class CheckableLinearLayout
    extends LinearLayout
    implements Checkable
{

  private boolean checked;

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

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

  @Override
  public void setChecked(boolean checked)
  {
    this.checked = checked;
  }

  @Override
  public void toggle()
  {
    checked = !checked;
  }

}

这里是项目的布局:

<?xml version="1.0" encoding="utf-8"?>
<com.package.CheckableLinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="horizontal"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:padding="10dip"
  android:background="@drawable/bg_contact"
>

  <ImageView
    android:id="@+id/contactPhoto"
    android:layout_width="75dip"
    android:layout_height="75dip"
  />

  <TextView
    android:id="@+id/contactName"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="20dip"
    android:layout_gravity="center_vertical"
    android:textColor="@color/black"
  />
</com.package.CheckableLinearLayout>

希望有人能帮助我!

提前谢谢你!

【问题讨论】:

    标签: android android-listview multipleselection android-actionmode


    【解决方案1】:

    您无需手动调用setItemChecked()

    只需使用

    设置 ListView(以前)
    contacts.setChoiceMode(CHOICE_MODE_MULTIPLE_MODAL);
    contacts.setMultiChoiceModeListener(new MultiChoiceModeListener() { ... });
    

    当你长按一个项目时,它会被自动检查(并且onCreateActionMode()会被调用为选择模式监听器)。

    【讨论】:

    • 谢谢你的帮助!我已经用更新的信息更新了我原来的帖子!
    • 对不起,我不明白当前的问题。请稍微修改一下您的问题(或者更好的是,如果这是一个不同问题,请询问另一个问题)。
    • 我在帖子中添加了答案,我将为其他主题创建一个新问题。谢谢你:)
    【解决方案2】:

    我终于找到了解决办法。

    原来onItemLongClick的方法是这个:

    @Override
      public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id)
      {
        if (actionMode != null)
        {
          return false;
        }
    
        contacts.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
        contacts.setItemChecked(position, true);
        getActionBarActivity().startSupportActionMode(new ActionModeCallback());
    
        return true;
      }
    

    我将getCheckedItemPositions() 方法调用到我的动作模式类的方法中。

    如果我在设置选择模式之前重写之前放置getActionBarActivity().startSupportActionMode(new ActionModeCallback()); 的方法,它似乎可以工作:)

    @Override
      public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id)
      {
        if (actionMode != null)
        {
          return false;
        }
    
        getActionBarActivity().startSupportActionMode(new ActionModeCallback());
        contacts.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
        contacts.setItemChecked(position, true);
    
        return true;
      }
    

    :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多