首页 文章

如何在选中复选框项时获取GridView位置?

提问于
浏览
0

我有一个带有 checkboximageViewtextView 的自定义GridView . 在 gridViewAdapter.getView() 中,我使用行和持有者来初始化checkbox,imageView和textview的值 .

现在当我点击复选框时,我需要获取该gridView项的位置,这样我就可以将图像从它的位置移动到gridView中的另一个位置 .

我试过这样的:

public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    ViewHolder holder = null;
    if (row == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);
        holder = new ViewHolder();
        holder.imageTitle = (TextView) row.findViewById(R.id.textView);
        holder.image = (ImageView) row.findViewById(R.id.imageView);
        holder.cb=(CheckBox)row.findViewById(R.id.checkBox);

            holder.cb.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //here with this checkbox which just got clicked,
                    // i want to access its gridview position or holder index
                    // so i can get access to the image

                }
            });
        row.setTag(holder);
    } else {
        holder = (ViewHolder) row.getTag();
    }

    ImageItem item = (ImageItem)dataArraylist.get(position);
    holder.imageTitle.setText(item.getTitle());
    holder.image.setImageBitmap(item.getImage());
   // holder.cb.setChecked(item.isSelected());

    return row;
}
    public static class ViewHolder {
    public TextView imageTitle;
    public ImageView image;
    public CheckBox cb;
}

更新:ok getView函数的参数“position”工作正常 . public View getView(int position,View convertView,ViewGroup parent){} . 但是现在当我在第一个视图中选中复选框时,复选框的位置会正确返回 . 但是当我向下滚动到下一个视图时,复选框的位置是随机的 . 怎么解决这个?

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

    final int pos=position;
    ViewHolder holder = null;

    if (convertView == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        convertView = inflater.inflate(layoutResourceId, parent, false);
        holder = new ViewHolder();
        holder.image = (ImageView) convertView.findViewById(R.id.imageView);
        holder.cb=(CheckBox)convertView.findViewById(R.id.checkBox);

        if(flag) {
            holder.cb.setVisibility(View.VISIBLE);
            holder.cb.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.d("MYLOG", "position: "+pos);
                    ImageItem tempObj;
                    ImageItem item = clickedArraylist.get(pos);
                   if(item.isSelected())
                        item.setSelected(false);
                    else
                        item.setSelected(true);

                        notifyDataSetChanged();

                }
            });
        }

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
        holder.cb.setOnCheckedChangeListener(null);
    }
        ImageItem item = clickedArraylist.get(position);
        holder.image.setImageBitmap(item.getImage());
        holder.cb.setChecked(item.isSelected());

    return convertView;
}


    public static class ViewHolder {
    public ImageView image;
    public CheckBox cb;
}

3 回答

  • 0

    一个非常简单的解决方案是将 tag 设置为 view 并在单击时获取它,如下所示:

    holder.cb.setTag(pos);
    holder.cb.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = (int) v.getTag();
    
                    ImageItem tempObj;
                    ImageItem item = clickedArraylist.get(position);
                    ...
            });
    

    然后用这个职位做你想做的事 . 如果您在实施时遇到问题,请告诉我 .

  • 0

    OMG这个工作:以下链接的第一个答案ListView in ArrayAdapter order get's mixed up when scrolling

    只需要在膨胀视图后立即关闭if(convertView == null)并删除其中的else部分

  • 0

    解决方案非常简单 . 这是我在我的一个应用程序中实现的代码 .

    checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (dataTaken.contains(position)) {
                    checkBox.setChecked(false);
                    // checkBox.setClickable(false);
                    final Snackbar snackbar = Snackbar.make(coordinatorLayout, "Another topic already being taken", Snackbar.LENGTH_SHORT);
                    snackbar.setAction("Ok", new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            snackbar.dismiss();
                        }
                    })
                            .show();
                } else {
                    if (isChecked) {
                        number.add(position);
                    } else if (!isChecked) {
                        for (int m = 0; m < number.size(); m++) {
                            if (number.get(m).equals(position)) {
                                number.remove(m);
                            }
                        }
                    }
                }
            }
        });
    

    完成后,您可以使用适配器类中的此功能访问列表

    public ArrayList<Integer> item() {
        return number;
    }
    

    现在来自您的Activity类调用

    variable = adapter.item();
    

    完成!

相关问题