【问题标题】:Android: how to set item checked in gridview?Android:如何设置在gridview中选中的项目?
【发布时间】:2013-01-03 07:47:03
【问题描述】:

有没有办法检查gridview 中的元素?

我找不到toggle() 方法或setChecked(true),我的gridview 有一个扩展BaseAdapter 的适配器,我想在检查元素时更改背景颜色(不仅仅是选中)。

我想要 ListView: GridView.setChoicheMode(MULTICHOICE) 然后 item.toggle()item.setChecked(true) 并将检查状态存储到视图中。

编辑:

我添加了一个空的CheckedTextView 来存储检查状态。 但是有没有更清洁的方法来做到这一点?

编辑2 现在我可以做我想做的事了,但是当我向下滚动 gridview 然后向上滚动时,所选项目不再被选中。

boolean checked = layout.getCheckedItemPositions().get(position);
                if(checked){
                    check.toggle();
                    view.setBackgroundColor(getResources().getColor(android.R.color.transparent));
                }
                else{
                    check.toggle();
                    view.setBackgroundColor(getResources().getColor(android.R.color.holo_green_light));
                }

其中 layout 是 gridview 的布局。 我想我必须修改我的适配器的getView方法,但是这段代码不起作用:

CheckedTextView check = (CheckedTextView) layout.findViewById(R.id.txv_grid_check);
        boolean checked = check.isChecked();
        if(checked){
            layout.setBackgroundColor(c.getResources().getColor(android.R.color.holo_green_light));
        }
        else{
            layout.setBackgroundColor(c.getResources().getColor(android.R.color.transparent));
        }

编辑 3

我认为没有办法做我想做的事(将状态存储在 CheckedTextView 元素中),因为滚动列表或网格视图时视图会被破坏并重新创建。所以我需要将项目的状态处理到适配器中。我使用了一个 int 的 HashSet 来存储检查项目的位置,并创建了一些公共方法来从 gridview 处理这个列表。 在 gridview 活动中,可以获取适配器,然后执行 myadapter.check(int position) 或 uncheck(int position)。 然后在adapter中,进入getView()方法,我们需要检查一个位置是否在列表中,并设置合适的背景颜色。

【问题讨论】:

  • 使用选择器 xmls 作为背景来显示选定的按下状态。
  • 在您的问题中添加更多说明。
  • @AdilSoomro 这可能是一个解决方案。现在我正在动态地做这件事
  • 你想一次设置一个项目还是多个项目?
  • @Rajesh 多个项目。现在我可以做我想做的事了,但是当我滚动 gridview 时,项目的状态似乎丢失了

标签: android gridview


【解决方案1】:

希望answer 对您有所帮助。在此示例中,网格项布局中有 TextView,您可以将其更改为 CheckedTextView 或 Checkbox。在 getView() 检查状态并设置网格项的背景颜色。

【讨论】:

  • 我不会实现这个,我会用标准的方式来做这个,比如列表。
  • 那个答案是一个黑客。我添加了一个答案,其中我描述了更标准的方法:stackoverflow.com/a/17389893/1200812
【解决方案2】:

使用此代码。这对我来说很有用。

public View getView(final int position, View convertView, ViewGroup parent) {
            View vi=convertView;
            if(convertView==null)
                vi = inflater.inflate(R.layout.list_row, null);

             final MyDat mydat;// = new MyDat();
            if (position >= MyViewedMeItemList.size()) {
                mydat = new MyDat();

            } 
            else
            {
                mydat = MyViewedMeItemList.get(position);
            }

            mydat.title = (TextView)vi.findViewById(R.id.title); // title
            mydat.artist = (TextView)vi.findViewById(R.id.artist); // artist name
            mydat.duration = (TextView)vi.findViewById(R.id.duration); // duration
            mydat.thumb_image=(ImageView)vi.findViewById(R.id.list_image); // thumb image
            mydat.cccheckbomx=(CheckBox)vi.findViewById(R.id.rajesh);        
            mydat.cccheckbomx.setVisibility(View.VISIBLE);


            if (mydat.myCheckStatus) {
                // Toast.makeText(MessageInboxDelete.this, "true --->" +
                // position,
                // Toast.LENGTH_SHORT).show();
                mydat.cccheckbomx.setChecked(true);
            } else {
                /*
                 * Toast.makeText(MessageInboxDelete.this, "false --->" +
                 * position, Toast.LENGTH_SHORT).show();
                 */
                mydat.cccheckbomx.setChecked(false);
            }

           mydat.cccheckbomx.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View paramView) {
                    // TODO Auto-generated method stub
                    //Toast.makeText(context, "Rajesh", Toast.LENGTH_SHORT).show();




                    int gridchild;
                    gridchild = list.getChildCount();
                    for (int j = 0; j < gridchild; j++) {
                        // DrawArea_Steptwo.gridview.getChildAt(j);

                    //  Toast.makeText(context, "Rajesh", Toast.LENGTH_SHORT).show();
                        RelativeLayout gridchildlayout = (RelativeLayout) list
                                .getChildAt(j);

                        CheckBox tempRadioToggle = (CheckBox) gridchildlayout
                                .findViewById(R.id.rajesh);

                        tempRadioToggle.setChecked(false);                    

                        MyDat tempViewholder = MyViewedMeItemList.get(j);
                        tempViewholder.myCheckStatus = false;
                    }


                    for(int j = 0; j < MyViewedMeItemList.size(); j++) {
                        MyDat tempViewholder = MyViewedMeItemList.get(j);
                        tempViewholder.myCheckStatus = false;
                    }
                    CheckBox tempRadioToggle = (CheckBox) paramView.findViewById(R.id.rajesh);      
                    tempRadioToggle.setChecked(true);

                    MyDat tempViewholder = MyViewedMeItemList.get(position);

                            if (tempViewholder.myCheckStatus == false) {
                                tempViewholder.myCheckStatus = true;
                                // tempViewholder.deleteRadioButton.setChecked(true);


                            } else {
                                tempViewholder.myCheckStatus = false;
                                // tempViewholder.deleteRadioButton.setChecked(false);

                            }


                }
            });
            HashMap<String, String> song = new HashMap<String, String>();
            song = data.get(position);

            // Setting all values in listview
            mydat.title.setText(song.get(CustomizedListView.KEY_TITLE));
            mydat.artist.setText(song.get(CustomizedListView.KEY_ARTIST));
            mydat.duration.setText(song.get(CustomizedListView.KEY_DURATION));
            imageLoader.DisplayImage(song.get(CustomizedListView.KEY_THUMB_URL), mydat.thumb_image);

            if (MyViewedMeItemList.size() <= position) {
                MyViewedMeItemList.add(mydat);
            }



            return vi;
        }

     public  class MyDat{

           Boolean myCheckStatus=false;
           TextView title ;
           TextView artist;
           TextView duration;
           ImageView thumb_image;
           CheckBox cccheckbomx;

       }
    }

【讨论】:

  • 您可以使用 GridView 为您进行检查 - 不需要 onCLickListener,您不必自己存储状态,也不必自己更新视觉外观。见:stackoverflow.com/a/17389893/1200812
猜你喜欢
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多