在GridView中选择多个项目

Bab*_*Dan 4 android gridview

我正在开发类似画廊的活动.一切运行良好但有一个关键功能缺失,我找不到一个体面的答案或解释.我需要的是让用户能够通过长按选择多个项目.

这是期望的结果:

在此输入图像描述

您可以清楚地看到所选图片和ActionBar中的选项.



我的设置是这样的:

1. 我的XML中有一个GridView:

<GridView xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/gridview"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:columnWidth="90dp"
          android:numColumns="auto_fit"
          android:verticalSpacing="5dp"
          android:horizontalSpacing="5dp"
          android:stretchMode="columnWidth"
          android:gravity="center"/>
Run Code Online (Sandbox Code Playgroud)

2.它附加到一个类,它扩展BaseAdapter并使用Picasso加载图像:

public class GalleryAdapter extends BaseAdapter {
    Context mContext;
    List<String> mDataset;

    public GalleryAdapter(Context context, List<String> dataset) {
        mContext = context;
        mDataset = dataset;
    }

    @Override
    public int getCount() {
        return mDataset.size();
    }

    @Override
    public Object getItem(int position) {
        return mDataset.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;
        if(convertView == null){
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams(200,200));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(8,8,8,8);
        } else {
            imageView = (ImageView) convertView;
        }

        //TODO: REMOVE INTEGER.VALUEOFF. IT'S MADE FOR MOCK
        Picasso.with(mContext).load(Integer.valueOf(mDataset.get(position))).fit().into(imageView);

        return imageView;
    }


}
Run Code Online (Sandbox Code Playgroud)

3.它附加到活动:

//Get images paths
List<String> data = getImagesPath(this);
    List<String> sortedData = new ArrayList<>();
    for(String file : data){
        sortedData.add(0, file);
    }

    GalleryAdapter adapter = new GalleryAdapter(this, sortedData);
    mGallery.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)


从现在开始斗争开始:

  • 我尝试在GridView中制作我的项目来实现Checkable:

    public class CheckableItem extends LinearLayout implements Checkable{
    private boolean mIsChecked = false;
    private static final int[] CHECKED_STATE_SET = { android.R.attr.state_checked };
    
    public CheckableItem(Context context) {
        super(context);
    }
    
    @Override
    protected int[] onCreateDrawableState(int extraSpace) {
        int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
        if (isChecked())
            mergeDrawableStates(drawableState, CHECKED_STATE_SET);
        return drawableState;
    }
    
    @Override
    public void setChecked(boolean checked) {
        mIsChecked = checked;
        refreshDrawableState();
    }
    
    @Override
    public boolean isChecked() {
        return mIsChecked;
    }
    
    @Override
    public void toggle() {
        setChecked(!isChecked());
        refreshDrawableState();
    }
    
    Run Code Online (Sandbox Code Playgroud)

然后我将其加载到我的XML中并添加.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE)到Activity中的GridView中.没啥事儿.

  • 添加了MultiChoiceModeListener:

    class MultiChoiceListener implements GridView.MultiChoiceModeListener{ @Override public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { int selectCount = mGallery.getCheckedItemCount(); switch (selectCount) { case 1: mode.setSubtitle("One item selected"); break; default: mode.setSubtitle("" + selectCount + " items selected"); break; } }

    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        mode.setTitle("Select Items");
        mode.setSubtitle("One item selected");
        return true;
    }
    
    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return false;
    }
    
    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        return false;
    }
    
    @Override
    public void onDestroyActionMode(ActionMode mode) {
    
    }
    
    Run Code Online (Sandbox Code Playgroud)

    }

    .setMultiChoiceModeListener(newMultiChoiceListener());

    .setChoiceMode(GridView.CHOICE_MODE_MULTIPLE)

然后将它添加到我的gridView class MultiChoiceListener implements GridView.MultiChoiceModeListener{ @Override public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { int selectCount = mGallery.getCheckedItemCount(); switch (selectCount) { case 1: mode.setSubtitle("One item selected"); break; default: mode.setSubtitle("" + selectCount + " items selected"); break; } }

<GridView xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/gridview"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:columnWidth="90dp"
          android:numColumns="auto_fit"
          android:verticalSpacing="5dp"
          android:horizontalSpacing="5dp"
          android:stretchMode="columnWidth"
          android:gravity="center"/>
Run Code Online (Sandbox Code Playgroud)

}但仍然没有结果.

有人可以提出一种在GridView中实现此项选择行为的方法吗?我想使用原生Android API,没有第三方库.

Ano*_*ous 6

我认为Checkable和我在你的代码中看到的其余内容有点过分......当我想实现类似的东西时我只是在GridView/ListView中显示的对象的类中添加另一个字段检查对象的状态.例:

class Image {
     Bitmap bm;
     boolean isChecked=false;

     public Image(Bitmap bm){
        this.bm=bm;
     }

     public boolean isChecked(){
         return isChecked;
     }
     public void toggleChecked(){
         isChecked = !isChecked;
     }
}
Run Code Online (Sandbox Code Playgroud)

并将ArrayList提供给适配器.在适配器的getView方法中我做了这样的事情;

@Override
public View getView(int position, View convertView, ViewGroup parent) { 

     if(images.get(position).isChecked()){
        //show the overlay view that suggests the item is selected
     }
     else{
        //hide the overlay view 
     } 
}
Run Code Online (Sandbox Code Playgroud)

最后在ListView的onItemClickListener中

listView.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        images.get(position).toggleChecked();
        listView.getAdapter().notifyDataSetChanged();
    }
});
Run Code Online (Sandbox Code Playgroud)