gpt4 book ai didi

android - 在 GridView 中选择多个项目

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:35:35 24 4
gpt4 key购买 nike

我正在开发类似画廊的 Activity 。一切运行良好,但缺少一个关键功能,我找不到合适的答案或解释。我需要的是让用户能够通过长按来选择多个项目。

这是期望的结果:

enter image description here

在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"/>

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


}

3.附加到Activity:

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


从现在开始斗争:

  • 我尝试在 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();
    }

然后我将它加载到我的 XML 中,并将 .setChoiceMode(GridView.CHOICE_MODE_MULTIPLE) 添加到 Activity 中的 GridView。什么都没发生。

  • 添加了MultiChoiceModeListener:

    类 MultiChoiceListener 实现 GridView.MultiChoiceModeListener{
    @覆盖
    public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
    int selectCount = mGallery.getCheckedItemCount();
    切换(选择计数){
    情况1:
    mode.setSubtitle("已选择一项");
    休息;
    默认:
    mode.setSubtitle(""+ selectCount + "选中的项目");
    休息;
    }
    }



    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
    mode.setTitle("选择项目");
    mode.setSubtitle("已选择一项");
    返回真;
    }

    @覆盖
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
    返回假;
    }

    @覆盖
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
    返回假;
    }

    @覆盖
    public void onDestroyActionMode(ActionMode 模式) {

    }

然后将其添加到我的 gridView .setMultiChoiceModeListener(newMultiChoiceListener()); 但仍然没有结果。

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

最佳答案

我认为 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;
}
}

并将 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
}
}

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

关于android - 在 GridView 中选择多个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35928051/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com