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