如何从适配器选中的复选框计数? [英] How to get checked checkbox count from adapter?
问题描述
我在我的应用程序的中间ListView和我已经添加上保存一个TextView和一个按钮底部的透明RelativeLayout的。 ListView中有各行的复选框。我的问题是,我想填充检查项目的量的TextView在列表中的项目被点击。有没有办法做到这一点?
这是我的布局:
<的RelativeLayout的xmlns:机器人=http://schemas.android.com/apk/res/android
机器人:layout_width =match_parent
机器人:layout_height =match_parent>
<的TextView
机器人:文字=@字符串/ compare_information
机器人:文字颜色=#8F8F8F
机器人:TEXTSIZE =20SP
机器人:layout_alignParentTop =真
机器人:layout_centerHorizontal =真
机器人:背景=@机器人:彩色/透明
机器人: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 &¤tMinute<=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屋!