Android 如何在栅格视图中一次显示所选图像

Android 如何在栅格视图中一次显示所选图像,android,Android,我有一个问题,我有一个自定义网格视图,其中有两个图像,一个是背景图像,另一个是复选标记图像,当我点击一个网格视图项目时,复选标记会显示图像选择,但当我们想要选择第二个网格视图项目时,它也会在同一个图像上显示复选标记,如下图所示,但我希望一次只能选择一个图像,这意味着如果选择了一个,其他复选标记将被隐藏。请告诉我正确的结果 代码: GridAdapter: public class GridAdapter extends BaseAdapter { private Activity

我有一个问题,我有一个自定义网格视图,其中有两个图像,一个是背景图像,另一个是复选标记图像,当我点击一个网格视图项目时,复选标记会显示图像选择,但当我们想要选择第二个网格视图项目时,它也会在同一个图像上显示复选标记,如下图所示,但我希望一次只能选择一个图像,这意味着如果选择了一个,其他复选标记将被隐藏。请告诉我正确的结果

代码: GridAdapter:

public class GridAdapter extends BaseAdapter {


    private Activity activity;
    private LayoutInflater inflater = null;
    ArrayList<Integer> items = new ArrayList<Integer>();

    int checked=0;
    public GridAdapter(Activity a, ArrayList<Integer> items) {
        activity = a;
        this.items = items;
        inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }

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

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

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

    public View getView(final int position, View convertView, ViewGroup parent) {
      //  View v = convertView;
          ImageView img;
        final ImageView img_select;

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.grid_items, null);
            img_select = (ImageView)convertView.findViewById(R.id.check_image);
            img_select.setTag(position);
            img = (ImageView)convertView.findViewById(R.id.img_GridItem);
            img.setTag(position);
            //img_select = (ImageView)v.findViewById(R.id.itemCheckBox);

            img.setBackgroundResource(items.get(position));


            img.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                Log.i("Clicked", "Tag###########");
                //img_select.setVisibility(View.INVISIBLE);
                img_select.setFocusable(true);
                img_select.setEnabled(true);
                if(checked==0)
                {

                img_select.setBackgroundResource(R.drawable.selectimage);
                GreetingTextContainer greet = GreetingTextContainer.getSingletonObject();
                greet.setPosition(position);
                checked =1;
                }
                else
                {
                    img_select.setBackgroundResource(0);
                    checked=0;
                }
            }
        });
        }



        return convertView;
    }
}
公共类GridAdapter扩展BaseAdapter{
私人活动;
专用充气机=空;
ArrayList items=新建ArrayList();
整数=0;
公共GridAdapter(活动a,ArrayList项){
活动=a;
这个项目=项目;
充气器=(LayoutInflater)activity.getSystemService(Context.LAYOUT\u充气器\u SERVICE);
}
public int getCount(){
返回items.size();
}
公共对象getItem(int位置){
返回位置;
}
公共长getItemId(int位置){
返回位置;
}
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
//视图v=转换视图;
图像视图img;
最终图像视图img_选择;
if(convertView==null){
convertView=充气机。充气(R.layout.grid_项,空);
img_select=(ImageView)convertView.findViewById(R.id.check_image);
img_选择setTag(位置);
img=(ImageView)convertView.findViewById(R.id.img\u GridItem);
img.setTag(位置);
//img_select=(ImageView)v.findviewbyd(R.id.itemCheckBox);
img.setBackgroundResource(items.get(position));
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
Log.i(“单击”、“标记”);
//img_select.setVisibility(视图不可见);
img_select.setFocusable(真);
img_select.setEnabled(真);
如果(选中==0)
{
img_select.setBackgroundResource(R.drawable.selectimage);
GreetingTextContainer greet=GreetingTextContainer.getSingletonObject();
问候。设置位置(位置);
选中=1;
}
其他的
{
img_select.setBackgroundResource(0);
选中=0;
}
}
});
}
返回视图;
}
}

好吧,有一个简单的方法可以做到这一点。您可以保留以前所选项目的引用。e、 g.在类级别创建一个变量,使用适配器。然后在onClick侦听器中,取消选择该图像,并使用当前视图(当前图像)设置该变量。e、 g


在这里,您将始终拥有单个选定图像视图的引用。因此,您可以在选择其他内容时取消选中它。我希望您能理解。

在您的代码中,您忘记取消选择除当前选定图像之外的所有图像。您只需为所选图像设置背景。您还需要为其他人设置未删除的图像

*步骤1*在GridAdapter类中将所选位置初始化为-1

int checked=0;
int selectedPosition = -1; 
*第2步*重写onclick方法,如下所示

@Override
    public void onClick(View v) {
         Log.i("Clicked", "Tag###########");
         //img_select.setVisibility(View.INVISIBLE);
         img_select.setFocusable(true);
         img_select.setEnabled(true);


        if(checked==0)
        {
            selectedPosition = position;

        }
        for(int i = 0; i<items.size(); i++){
            if(i == selectedPosition){
                img_select.setBackgroundResource(R.drawable.selectimage);
                GreetingTextContainer greet = GreetingTextContainer.getSingletonObject();
                greet.setPosition(position);
                checked =1;
            }else{
                 img_select.setBackgroundResource(0);
                 checked=0;

            }
        }
    }
@覆盖
公共void onClick(视图v){
Log.i(“单击”、“标记”);
//img_select.setVisibility(视图不可见);
img_select.setFocusable(真);
img_select.setEnabled(真);
如果(选中==0)
{
selectedPosition=位置;
}

对于(inti=0;i在重写的方法中执行以下操作

gridView.setOnItemClickListener(new OnItemClickListener() {
 public void onItemClick(AdapterView<?> p, View view, int position,
                        long id) {
                    pos=position;
                    for(int i=0;i<ur_imageList.size();i++){
                        if(i==position){
                            //do nothing
                        }
                        else{
                            ur_imageList.get(i).isSelected=false;
                        }
                    }
                    if(ur_imageList.get(position).isSelected){//To deselect If selected
                        ur_imageList.get(position).isSelected=false;
                    }
                    else{   
                        ur_imageList.get(position).isSelected=true;
                    }
                    gridview.invalidateViews();
                }
            });
gridView.setOnItemClickListener(新的OnItemClickListener(){
公共虚线单击(适配器视图p、视图视图、内部位置、,
长id){
pos=位置;

对于(int i=0;i可能重复的请勿在同一主题上发布重复的问题。当然,这是一个轻微的修改,但它太轻微了,不足以保证一个全新的问题。我已将原始问题作为此问题的副本关闭,因为这确实是所寻求的预期行为。但是,堆栈溢出不是您的c来自rowd的增量开发团队,请不要将其视为重复的,只需进行琐碎的编辑。
GreetingTextContainer
这个类做什么。请发布代码。谢谢你的问题,帮了我很多忙
gridView.setOnItemClickListener(new OnItemClickListener() {
 public void onItemClick(AdapterView<?> p, View view, int position,
                        long id) {
                    pos=position;
                    for(int i=0;i<ur_imageList.size();i++){
                        if(i==position){
                            //do nothing
                        }
                        else{
                            ur_imageList.get(i).isSelected=false;
                        }
                    }
                    if(ur_imageList.get(position).isSelected){//To deselect If selected
                        ur_imageList.get(position).isSelected=false;
                    }
                    else{   
                        ur_imageList.get(position).isSelected=true;
                    }
                    gridview.invalidateViews();
                }
            });