如何在 Gridview 中仅突出显示一个带边框的项目

问题描述 投票:0回答:4

我试图通过为其创建白色边框来在网格视图中显示所选项目。

我设法做到了,但我遇到的问题是如何“取消选择”之前选择的那个。重点是只保留一项带有边框的项目。

这是我到目前为止所拥有的:

GridView gridView = (GridView) findViewById(R.id.gridViewFX);
        gridView.setAdapter(new ImageAdapter(this));
        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                for(int i = 0; i< parent.getCount(); i++){
                 //Unselect all the views in parent

                }
                //Select the item clicked
                Log.v("FILTER NAME:", filterNames.get(position));
                selectedFilterName = filterNames.get(position);

                ViewHolder selectedHolder = (ViewHolder)view.getTag();
                RoundedImageView iv = selectedHolder.getImageView();
                iv.setBorderColor(Color.WHITE);
                iv.setBorderWidth(20.f);


            }

更新:这是我的 ImageAdapter 类和 ViewHolder:

public class ImageAdapter extends BaseAdapter {

        private LayoutInflater inflater;
        private Context mContext;

        public ImageAdapter(Context c) {
            mContext = c;
            inflater = LayoutInflater.from(mContext);
        }

        public int getCount() {
            return bitmaps.size();
        }

        public Object getItem(int position) {
            return null;
        }

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

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            final ViewHolder holder;
            View view = convertView;
            if (view == null) {
                view = inflater.inflate(R.layout.item_grid_image_fx, parent, false);
                holder = new ViewHolder();
                assert view != null;
                holder.imageView = (RoundedImageView) view.findViewById(R.id.gridImageFXView);
                holder.textView = (TextView)view.findViewById(R.id.effectNameTextView);
                view.setTag(holder);
            } else {
                holder = (ViewHolder) view.getTag();
            }

            holder.imageView.setImageBitmap(bitmaps.get(position));
            holder.textView.setText("" + filterNames.get(position));

            return view;
        }
    }

    static class ViewHolder {
        public RoundedImageView getImageView() {
            return imageView;
        }


        RoundedImageView imageView;
        TextView textView;
    }

任何有关在 for 循环中放入“取消选择”的内容的帮助将不胜感激!

android gridview
4个回答
1
投票

在开始以下操作之前,您必须为视图设置 Id。

第1步:

创建一个整型变量

int id = 0;

第2步:

onItemClick
监听器内部更改值

id
=在这里更改ID

第三步:

内部

getView()

if (id == getLayoutId){
//Set Your Border
}else{
//Remove the border here
}

注:

现在遇到另一个问题,当单击同一项目时,您需要删除选择。所以

onItemClick下需要条件

if (id == your_current_clicked_id){
id = 0;
}else{
id = //set_your_id;
}

1
投票

解决了! - 我终于弄清楚了。解决方案如下: - 在上面的代码中替换它,它就可以工作了

//Unselect all views before selecting new one
                int count = parent.getChildCount();
                for (int i = 0; i < count; i++) {
                    View childAt = parent.getChildAt(i);
                    ViewHolder viewHolder = (ViewHolder)childAt.getTag();
                    viewHolder.getImageView().setBorderWidth(.0f);
                }

0
投票

使用选择器

为您的选择器编写可绘制文件,称为selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:state_pressed="true">
    <shape>
        <solid android:color="@color/blue" />
    </shape>
</item>

<item android:state_pressed="false">
    <shape>
       <solid android:color="@android:color/transparent" />
    </shape>
</item>
</selector>

然后在gridview的xml中添加以下两行

 android:drawSelectorOnTop="true"
 android:listSelector="@drawable/selector"

0
投票

您可以在适配器中使用所选项目索引整数变量,然后您可以使用以下代码

 notifyItemChanged(previousPosition);
 selectedPos = index_of_item_clicked;
 notifyItemChanged(selectedPos); 
© www.soinside.com 2019 - 2024. All rights reserved.