如何从适配器选中的复选框计数? [英] How to get checked checkbox count from adapter?

查看:134
本文介绍了如何从适配器选中的复选框计数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的应用程序的中间ListView和我已经添加上保存一个TextView和一个按钮底部的透明RelativeLayout的。 ListView中有各行的复选框。我的问题是,我想填充检查项目的量的TextView在列表中的项目被点击。有没有办法做到这一点?
这是我的布局:

 <的RelativeLayout的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:layout_width =match_parent
    机器人:layout_height =match_parent>
    <的TextView
        机器人:文字=@字符串/ compare_information
        机器人:文字颜色=#8F8F8F
        机器人:TEXTSIZE =20SP
        机器人:layout_alignParentTop =真
        机器人:layout_centerHorizo​​ntal =真
        机器人:背景=@机器人:彩色/透明
        机器人:layout_marginBottom =10dp
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:ID =@ + ID / informationText/>
    < ListView控件
        机器人:ID =@ + ID / lvCompare
        机器人:layout_width =match_parent
        机器人:layout_height =WRAP_CONTENT
        机器人:分=@空
        机器人:layout_alignParentLeft =真
        机器人:layout_marginLeft =5DP
        机器人:layout_marginRight =5DP
        机器人:layout_below =@ + ID / informationText>    < /&的ListView GT;
    < RelativeLayout的
        机器人:layout_width =FILL_PARENT
        机器人:layout_height =75dp
        机器人:layout_alignParentBottom =真
        机器人:背景=#90303030>
        <的TextView
            机器人:ID =@ + ID / checkedItems
            机器人:文字=0 10
            机器人:layout_width =WRAP_CONTENT
            机器人:layout_height =WRAP_CONTENT
            机器人:文字颜色=#EEEEEE
            机器人:TEXTSIZE =14sp
            机器人:重力=center_vertical |左
            />
        <按钮
            机器人:ID =@ + ID /比较
            机器人:背景=@绘制/ filter_button_layout
            机器人:layout_width =WRAP_CONTENT
            机器人:layout_height =WRAP_CONTENT
            机器人:重力=center_vertical |权
            机器人:文字=@字符串/比较
            机器人:文字颜色=#FFFFFF
            机器人:TEXTSIZE =18sp
            />
    < / RelativeLayout的>
< / RelativeLayout的>

这是我的适配器:

 公共类CompareListAdapter扩展ArrayAdapter<餐厅> {
        私人的ArrayList<餐厅>名单=新的ArrayList<餐厅>();
        私人上下文的背景下;
        私有静态诠释checkBoxCounter = 0;
        私有静态诠释checkBoxInitialized = 0;
        私人诠释layoutResourceId;
        私人TextView的cCheckedItems;
        私人最终字符串INFORMATION_TEXT =选择6家公司比较;        公共CompareListAdapter(上下文的背景下,INT资源,
                清单<餐厅>对象的TextView textViewToEdit){
            超级(上下文,资源,对象);
            this.context =背景;
            this.layoutResourceId =资源;
            checkBoxCounter = 0;
            cCheckedItems = textViewToEdit;
            //我们把该数组中的字符串中的散列映射存储
            的for(int i = 0; I< objects.size(); ++ I){
                list.add(objects.get(I));
            }
        }        公共查看getView(最终诠释的立场,观点convertView,父母的ViewGroup){
            查看查看= NULL;
            如果(convertView == NULL){
                LayoutInflater吹气=(LayoutInflater)context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
                鉴于= inflater.inflate(layoutResourceId,父母,假);
                最后ViewHolder viewHolder =新ViewHolder();
                viewHolder.cName =(TextView中)view.findViewById(R.id.rest_name_textView1);
                viewHolder.addres1 =(TextView中)view.findViewById(R.id.address1_textView2);
                viewHolder.addres2 =(TextView中)view.findViewById(R.id.address2_textView3);
                viewHolder.openingTime =(TextView中)view.findViewById(R.id.opening_hour_textView4);
                viewHolder.distance =(TextView中)view.findViewById(R.id.distance_user_textView5);
                viewHolder.openImage =(ImageView的)view.findViewById(R.id.clock_imageView2);
                viewHolder.checkBox =(复选框)view.findViewById(R.id.checkBox1);
                viewHolder.cbBackground =(RelativeLayout的)view.findViewById(R.id.checkbox_layout);
                viewHolder.rating =(的RatingBar)view.findViewById(R.id.restaurant_ratingBar1);
                viewHolder.checkBox.setOnCheckedChangeListener(新OnCheckedChangeListener(){
                    @覆盖
                    公共无效onCheckedChanged(CompoundButton buttonView,布尔器isChecked){
                        如果(器isChecked&放大器;&放大器; checkBoxCounter&GT = 2){
                            list.get(位置).setChecked(假);
                            viewHolder.checkBox.setChecked(假);
                            viewHolder.cbBackground.setBackgroundResource(R.drawable.checkbox_background);
                        }其他{
                            餐厅元素=(餐厅)viewHolder.checkBox.getTag();
                            element.setChecked(buttonView.isChecked());
                            如果(器isChecked){
                                viewHolder.cbBackground.setBackgroundResource(R.drawable.checkbox_background_checked);
                                checkBoxCounter ++;
                            }其他{
                                viewHolder.cbBackground.setBackgroundResource(R.drawable.checkbox_background);
                                checkBoxCounter--;
                            }
                        }
                    Log.d(MYLOG INSIDE getView,将String.valueOf(cCheckedItems));
                    cCheckedItems.setText(checkBoxCounter +6);
                    Toast.makeText(上下文,也有+ checkBoxCounter +项目中选择Toast.LENGTH_LONG).show();}});
}});
                view.setTag(viewHolder);
                viewHolder.checkBox.setTag(list.get(位置));
            }其他{
                鉴于= convertView;
                ((ViewHolder)view.getTag())checkBox.setTag(list.get(位置))。
            }
            ViewHolder viewHolder =(ViewHolder)view.getTag();
            餐厅的obj = list.get(位置);
            viewHolder.rating.setRating((浮点)obj.getRating());
            viewHolder.cName.setText(obj.getRestaurantName());
            viewHolder.addres1.setText(obj.getAddress1());
            viewHolder.addres2.setText(obj.getAddress2());
            viewHolder.openingTime.setText(obj.getDayOfWeek()++ obj.getOpeningHour());
            viewHolder.distance.setText(obj.getDistance());
            viewHolder.checkBox.setChecked(obj.isChecked());
            如果(obj.isChecked()){
                viewHolder.cbBackground.setBackgroundResource(R.drawable.checkbox_background_checked);
            }其他{
                viewHolder.cbBackground.setBackgroundResource(R.drawable.checkbox_background);
            }
            布尔isOpen会= checkForOpen(obj.getDayOfWeek(),obj.getOpeningHour());
            如果(isOpen会)
                viewHolder.openImage.setImageResource(R.drawable.opened_logo);
            其他viewHolder.openImage.setImageResource(R.drawable.closed_logo);
            返回视图。
        }
        私人布尔checkForOpen(平日字符串,字符串openingTimeRange){
            日历CAL = Calendar.getInstance();
            INT currentMinute = cal.get(Calendar.HOUR_OF_DAY)* 60 + cal.get(Calendar.MINUTE);; // today.MINUTE;
            INT dayNo = cal.get(Calendar.DAY_OF_WEEK);
            串[] TIMERANGE = openingTimeRange.split( - );            INT openingMn=Integer.parseInt(timeRange[0].substring(0,2))*60+Integer.parseInt(timeRange[0].substring(3,5));            INT closingMn=Integer.parseInt(timeRange[1].substring(0,2))*60+Integer.parseInt(timeRange[1].substring(3,5));            如果(weekDay.equals(getDayOfWeekFromDayNo(dayNo))及&放大器; currentMinute&GT = openingMn&放大器;&放大器; currentMinute&下; = closingMn)
                返回true;
            返回false;
        }
        公共字符串getDayOfWeekFromDayNo(INT dayNo)
        {
            串DAYNAME =;
            开关(dayNo){
            情况1:
                DAYNAME =SUNDAY;
                打破;
            案例2:
                DAYNAME =星期一;
                打破;
            案例3:
                DAYNAME =星期二;
                打破;
            情况4:
                DAYNAME =星期三;
                打破;
            情况5:
                DAYNAME =星期四
                打破;
            情况6:
                DAYNAME =FRIDAY;
                打破;
            案例7:
                DAYNAME =SATERDAY;
                打破;            默认:
                打破;
            }
            返回DAYNAME;
        }
        静态类ViewHolder {
            的RatingBar评级;
            复选框复选框;
            RelativeLayout的cbBackground;
            TextView的CNAME,addres1,addres2,openingTime,距离;
            ImageView的openImage;
        }
    }

更新:得到它的工作。添加了什么我现在有工作在我的IDE。我做在构造一个TextView要求,并保存的TextView的在适配器然后叫,当我需要它。登录设置进行测试,如果存在的TextView。多亏@SagarPilkhwal用于引导到该溶液中。


解决方案

 私人TextView的cCheckedItems;
....
cCheckedItems =(TextView中)view.findViewById(R.id.checkedItems);
....
    viewHolder.checkBox.setOnCheckedChangeListener(新OnCheckedChangeListener(){
    @覆盖
    公共无效onCheckedChanged(CompoundButton buttonView,布尔器isChecked){
        如果(器isChecked&放大器;&放大器; checkBoxCounter&GT = 2){
            list.get(位置).setChecked(假);
            viewHolder.checkBox.setChecked(假);
            viewHolder.cbBackground.setBackgroundResource(R.drawable.checkbox_background);
        }其他{
            餐厅元素=(餐厅)viewHolder.checkBox.getTag();
            element.setChecked(buttonView.isChecked());
            如果(器isChecked){
                viewHolder.cbBackground.setBackgroundResource(R.drawable.checkbox_background_checked);
                checkBoxCounter ++;
            }其他{
                viewHolder.cbBackground.setBackgroundResource(R.drawable.checkbox_background);
                checkBoxCounter--;
            }
            cCheckedItems.setText(checkBoxCounter); //< - 添加此
            Toast.makeText(上下文,也有+ checkBoxCounter +项目中选择Toast.LENGTH_LONG).show();
        }}});

I have a ListView in the middle of my app and i have added a transparent RelativeLayout on the bottom that holds a TextView and a button. In the ListView there is a checkbox for each row. My problem is that i want to populate the TextView with the amount of checked item in the list as an item is clicked. Is there a way to do that? this is my layout:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <TextView
        android:text="@string/compare_information"
        android:textColor="#8F8F8F"
        android:textSize="20sp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:background="@android:color/transparent"
        android:layout_marginBottom="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/informationText" />
    <ListView
        android:id="@+id/lvCompare"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="@null"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:layout_below="@+id/informationText">

    </ListView>
    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="75dp"
        android:layout_alignParentBottom="true"
        android:background="#90303030" >
        <TextView
            android:id="@+id/checkedItems"
            android:text="0 of 10"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#EEEEEE"
            android:textSize="14sp"
            android:gravity="center_vertical|left"
            />
        <Button
            android:id="@+id/compare"
            android:background="@drawable/filter_button_layout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_vertical|right"
            android:text="@string/compare"
            android:textColor="#FFFFFF"
            android:textSize="18sp"
            />
    </RelativeLayout>
</RelativeLayout>

This is my adapter:

    public class CompareListAdapter extends ArrayAdapter<Restaurant>{
        private ArrayList<Restaurant> list = new ArrayList<Restaurant>();
        private Context context;
        private static int checkBoxCounter = 0;
        private static int checkBoxInitialized = 0;
        private int layoutResourceId;
        private TextView cCheckedItems;
        private final String INFORMATION_TEXT = "Select six companies to compare";

        public CompareListAdapter(Context context, int resource,
                List<Restaurant> objects,TextView textViewToEdit ) {
            super(context, resource, objects);
            this.context = context;
            this.layoutResourceId = resource;
            checkBoxCounter = 0;
            cCheckedItems = textViewToEdit;
            // We put the strings from the array in to the hash map for storing
            for (int i = 0; i < objects.size(); ++i) {
                list.add(objects.get(i));
            }
        }

        public View getView( final int position, View convertView, ViewGroup parent) {
            View view = null;
            if(convertView==null){
                LayoutInflater inflater=(LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
                view=inflater.inflate(layoutResourceId, parent, false);
                final ViewHolder viewHolder = new ViewHolder();
                viewHolder.cName =(TextView) view.findViewById(R.id.rest_name_textView1);
                viewHolder.addres1 =(TextView) view.findViewById(R.id.address1_textView2);
                viewHolder.addres2 =(TextView) view.findViewById(R.id.address2_textView3);
                viewHolder.openingTime =(TextView) view.findViewById(R.id.opening_hour_textView4);
                viewHolder.distance =(TextView) view.findViewById(R.id.distance_user_textView5);
                viewHolder.openImage =(ImageView)view.findViewById(R.id.clock_imageView2);
                viewHolder.checkBox = (CheckBox) view.findViewById(R.id.checkBox1);
                viewHolder.cbBackground = (RelativeLayout) view.findViewById(R.id.checkbox_layout);
                viewHolder.rating = (RatingBar) view.findViewById(R.id.restaurant_ratingBar1);
                viewHolder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        if(isChecked && checkBoxCounter>=2){
                            list.get(position).setChecked(false);
                            viewHolder.checkBox.setChecked(false);
                            viewHolder.cbBackground.setBackgroundResource(R.drawable.checkbox_background);
                        }else {
                            Restaurant element = (Restaurant) viewHolder.checkBox.getTag();
                            element.setChecked(buttonView.isChecked());
                            if (isChecked) {
                                viewHolder.cbBackground.setBackgroundResource(R.drawable.checkbox_background_checked);
                                checkBoxCounter++;
                            } else {
                                viewHolder.cbBackground.setBackgroundResource(R.drawable.checkbox_background);
                                checkBoxCounter--;
                            }                            
                        }
                    Log.d("MYLOG INSIDE getView", String.valueOf(cCheckedItems));
                    cCheckedItems.setText(checkBoxCounter + " of 6");
                    Toast.makeText(context, "there are " + checkBoxCounter + " items selected", Toast.LENGTH_LONG).show();}});
}});
                view.setTag(viewHolder);
                viewHolder.checkBox.setTag(list.get(position));
            }else{
                view = convertView;
                ((ViewHolder) view.getTag()).checkBox.setTag(list.get(position));
            }
            ViewHolder viewHolder = (ViewHolder) view.getTag();
            Restaurant obj=list.get(position);
            viewHolder.rating.setRating((float) obj.getRating());
            viewHolder.cName.setText(obj.getRestaurantName());
            viewHolder.addres1.setText(obj.getAddress1());
            viewHolder.addres2.setText(obj.getAddress2());
            viewHolder.openingTime.setText(obj.getDayOfWeek()+" "+obj.getOpeningHour());
            viewHolder.distance.setText(obj.getDistance());
            viewHolder.checkBox.setChecked(obj.isChecked());
            if(obj.isChecked()) {
                viewHolder.cbBackground.setBackgroundResource(R.drawable.checkbox_background_checked);
            }else{
                viewHolder.cbBackground.setBackgroundResource(R.drawable.checkbox_background);
            }
            boolean isOpen=checkForOpen(obj.getDayOfWeek(),obj.getOpeningHour());
            if(isOpen)
                viewHolder.openImage.setImageResource(R.drawable.opened_logo);
            else viewHolder.openImage.setImageResource(R.drawable.closed_logo);
            return view;
        }
        private boolean checkForOpen(String weekDay,String openingTimeRange) {
            Calendar cal = Calendar.getInstance(); 


            int currentMinute=cal.get(Calendar.HOUR_OF_DAY)*60+cal.get(Calendar.MINUTE);;//today.MINUTE;
            int dayNo=cal.get(Calendar.DAY_OF_WEEK);
            String []timeRange=openingTimeRange.split("-");

            int openingMn=Integer.parseInt(timeRange[0].substring(0,2))*60+Integer.parseInt(timeRange[0].substring(3,5));

            int closingMn=Integer.parseInt(timeRange[1].substring(0,2))*60+Integer.parseInt(timeRange[1].substring(3,5));

            if(weekDay.equals(getDayOfWeekFromDayNo(dayNo))&& currentMinute>=openingMn  &&currentMinute<=closingMn)
                return true;


            return false;
        }
        public String getDayOfWeekFromDayNo(int dayNo)
        {
            String dayName="";
            switch (dayNo) {
            case 1:
                dayName="SUNDAY";
                break;
            case 2:
                dayName="MONDAY";
                break;
            case 3:
                dayName="TUESDAY";
                break;
            case 4:
                dayName="WEDNESDAY";
                break;
            case 5:
                dayName="THURSDAY";
                break;
            case 6:
                dayName="FRIDAY";
                break;
            case 7:
                dayName="SATERDAY";
                break;

            default:
                break;
            }
            return dayName;              
        }
        static class ViewHolder{
            RatingBar rating;
            CheckBox checkBox;
            RelativeLayout cbBackground;
            TextView cName, addres1, addres2, openingTime, distance;
            ImageView openImage;


        }
    }

Update : Got it working. Added what i have now working on my IDE. I made a TextView requirement in the constructor and saved that TextView in the adapter then called it when i need it. Log set up for testing if TextView exists. Thanks to @SagarPilkhwal for guiding to the solution.

解决方案

private TextView cCheckedItems;
....
cCheckedItems =(TextView) view.findViewById(R.id.checkedItems);
....
    viewHolder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if(isChecked && checkBoxCounter>=2){
            list.get(position).setChecked(false);
            viewHolder.checkBox.setChecked(false);
            viewHolder.cbBackground.setBackgroundResource(R.drawable.checkbox_background);
        }else {
            Restaurant element = (Restaurant) viewHolder.checkBox.getTag();
            element.setChecked(buttonView.isChecked());
            if (isChecked) {
                viewHolder.cbBackground.setBackgroundResource(R.drawable.checkbox_background_checked);
                checkBoxCounter++;              
            } else {
                viewHolder.cbBackground.setBackgroundResource(R.drawable.checkbox_background);
                checkBoxCounter--;
            }
            cCheckedItems.setText(checkBoxCounter); //<-- ADD THIS
            Toast.makeText(context, "there are " + checkBoxCounter + " items selected", Toast.LENGTH_LONG).show();
        }}});

这篇关于如何从适配器选中的复选框计数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆