简体   繁体   中英

Select checkall in listview to check all the checkbox

I am having an listview with checkboxes,from the top i am giving an "select all",while check the select all,i want all checkbox has to select it.But now while checking the select all is not selecting all the checkbox.Seperate checkbox is working fine.

This is the layout for select all for listview.

<LinearLayout 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"        
        android:gravity="right"
        android:paddingRight="5dp"
        >

        <TextView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/strAll"
            />        

        <CheckBox
            android:id="@+id/chkAll"        
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />    

    </LinearLayout>

    </RelativeLayout>

"ContactActivity.java"

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    setContentView(R.layout.get);
    lv =(ListView)findViewById(R.id.lv);
    getAllCallLogs(this.getContentResolver());

     ma = new MyAdapter();
    lv.setAdapter(ma);
    lv.setOnItemClickListener(this); 
    lv.setItemsCanFocus(false);
    lv.setTextFilterEnabled(true);
    send = (Button) findViewById(R.id.button1);


    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice,lv);
    setListAdapter(adapter);

    final CheckBox chkAll =  ( CheckBox ) findViewById(R.id.chkAll);  


    chkAll.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub
            int size = 0;
            boolean isChecked = chkAll.isChecked();
            if (isChecked == true) {
                size = lv.getCount();
                for (int i = 0; i <= size; i++)
                    lv.setItemChecked(i, true);
            } else if(isChecked==false)
            {
                size = lv.getCount();
                for (int i = 0; i <= size; i++)
                    lv.setItemChecked(i, false);
            }
        }
    });
    send.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View v) {
              StringBuilder checkedcontacts= new StringBuilder();
            System.out.println(".............."+ma.mCheckStates.size());
            for(int i = 0; i < name1.size(); i++)

                {
                if(ma.mCheckStates.get(i)==true)
                {
                      phno0.add(phno1.get(i).toString()) ;
                     checkedcontacts.append(name1.get(i).toString());
                     checkedcontacts.append("\n");

                }
                else
                {
                    System.out.println("..Not Checked......"+name1.get(i).toString());
                }


            }
                Toast.makeText(ContactActivity.this, checkedcontacts,1000).show();
                Intent returnIntent = new Intent();
                 returnIntent.putStringArrayListExtra("name",phno0);
                 setResult(RESULT_OK,returnIntent);     
                 finish();

        }       
    });


}

private void setListAdapter(ArrayAdapter<String> adapter1) {
    // TODO Auto-generated method stub

}

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
    // TODO Auto-generated method stub
     ma.toggle(arg2);
}

public  void getAllCallLogs(ContentResolver cr) {

    Cursor phones = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null);
    while (phones.moveToNext())
    {
      String name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
      String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
      System.out.println(".................."+phoneNumber); 
      name1.add(name);
      phno1.add(phoneNumber);
    }

    phones.close();
 }
class MyAdapter extends BaseAdapter implements CompoundButton.OnCheckedChangeListener
{  private SparseBooleanArray mCheckStates;
   LayoutInflater mInflater;
    TextView tv1,tv;
    CheckBox cb;
    MyAdapter()
    {
        mCheckStates = new SparseBooleanArray(name1.size());
        mInflater = (LayoutInflater)ContactActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return name1.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub

        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        View vi=convertView;
        if(convertView==null)

         vi = mInflater.inflate(R.layout.row, null); 
         tv= (TextView) vi.findViewById(R.id.textView1);
         tv1= (TextView) vi.findViewById(R.id.textView2);
         cb = (CheckBox) vi.findViewById(R.id.checkBox1);
         tv.setText("Name :"+ name1.get(position));
         tv1.setText("Phone No :"+ phno1.get(position));
         cb.setTag(position);
         cb.setChecked(mCheckStates.get(position, false));
         cb.setOnCheckedChangeListener(this);



        return vi;
    }


    private int getCheckedItemCount(){

        int cnt = 0;

        SparseBooleanArray positions = lv.getCheckedItemPositions();
        int itemCount = lv.getCount();

        for(int i=0;i<itemCount;i++){
            if(positions.get(i))
                cnt++;
        }

        return cnt;
    }




     public boolean isChecked(int position) {
            return mCheckStates.get(position, false);
        }

        public void setChecked(int position, boolean isChecked) {
            mCheckStates.put(position, isChecked);
        }

        public void toggle(int position) {
            setChecked(position, !isChecked(position));
        }
    @Override
    public void onCheckedChanged(CompoundButton buttonView,
            boolean isChecked) {
        // TODO Auto-generated method stub

         mCheckStates.put((Integer) buttonView.getTag(), isChecked);                 
    }       
}

I am posting another answer. Please listen carefully.

1.) Create a global boolean variable :-

    boolean flag = false;

2.)in your getView, do this. This will not check all the checkboxes in your listview. I am assuming that you have only one checkbox in your listview.

    holder.checkBoxinyourListView.setChecked(flag);

3.) Now, in the listener of the checkbox which is NOT in your listview, add this code :-

checkBox not in listView.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            // TODO Auto-generated method stub
            flag = !flag;
            adapter.notifyDataSetChanged();
        }
    });

ScreenShot 1:- When not checked 在此处输入图片说明

ScreenShot 2:- When Checked 在此处输入图片说明

This Code Works 100%

NOTE :- In my project, i am using a lazy loader for images. Please don't get confused. Jars in my project :- universal-image-loader-1.8.7 , android-support-v4

MainActivity.Class

package com.example.listviewwithselectallcheckbxox;

//import it.sephiroth.android.library.widget.AdapterView;
//import it.sephiroth.android.library.widget.AdapterView.OnItemClickListener;
//import it.sephiroth.android.library.widget.HListView;

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Toast;

import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageLoadingListener;
import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;

public class MainActivity extends Activity{
    DisplayImageOptions options;
    ArrayList<Integer> checkedPositions = new ArrayList<Integer>();
    boolean flag = false;
    CheckBox selectAll;
    private static final String LOG_TAG = "MainActivity";
    ListView listView;
    TestAdapter mAdapter;
    List<RowItem> rowItems;
    public static final String[] url = {"https://lh6.googleusercontent.com/-55osAWw3x0Q/URquUtcFr5I/AAAAAAAAAbs/rWlj1RUKrYI/s1024/A%252520Photographer.jpg",
        "https://lh4.googleusercontent.com/--dq8niRp7W4/URquVgmXvgI/AAAAAAAAAbs/-gnuLQfNnBA/s1024/A%252520Song%252520of%252520Ice%252520and%252520Fire.jpg",
        "https://lh5.googleusercontent.com/-7qZeDtRKFKc/URquWZT1gOI/AAAAAAAAAbs/hqWgteyNXsg/s1024/Another%252520Rockaway%252520Sunset.jpg",
        "https://lh3.googleusercontent.com/--L0Km39l5J8/URquXHGcdNI/AAAAAAAAAbs/3ZrSJNrSomQ/s1024/Antelope%252520Butte.jpg",
        "https://lh6.googleusercontent.com/-8HO-4vIFnlw/URquZnsFgtI/AAAAAAAAAbs/WT8jViTF7vw/s1024/Antelope%252520Hallway.jpg",
        "https://lh4.googleusercontent.com/-WIuWgVcU3Qw/URqubRVcj4I/AAAAAAAAAbs/YvbwgGjwdIQ/s1024/Antelope%252520Walls.jpg",
        "https://lh6.googleusercontent.com/-UBmLbPELvoQ/URqucCdv0kI/AAAAAAAAAbs/IdNhr2VQoQs/s1024/Apre%2525CC%252580s%252520la%252520Pluie.jpg",
        "https://lh3.googleusercontent.com/-s-AFpvgSeew/URquc6dF-JI/AAAAAAAAAbs/Mt3xNGRUd68/s1024/Backlit%252520Cloud.jpg",
        "https://lh5.googleusercontent.com/-bvmif9a9YOQ/URquea3heHI/AAAAAAAAAbs/rcr6wyeQtAo/s1024/Bee%252520and%252520Flower.jpg",
        "https://lh5.googleusercontent.com/-n7mdm7I7FGs/URqueT_BT-I/AAAAAAAAAbs/9MYmXlmpSAo/s1024/Bonzai%252520Rock%252520Sunset.jpg",
        "https://lh6.googleusercontent.com/-4CN4X4t0M1k/URqufPozWzI/AAAAAAAAAbs/8wK41lg1KPs/s1024/Caterpillar.jpg",
    "https://lh3.googleusercontent.com/-rrFnVC8xQEg/URqufdrLBaI/AAAAAAAAAbs/s69WYy_fl1E/s1024/Chess.jpg"};

    @Override
    protected void onCreate( Bundle savedInstanceState ) {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_main );

        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
        .build();
        ImageLoader.getInstance().init(config);

        listView = (ListView) findViewById( R.id.hListView1 );
        selectAll = (CheckBox) findViewById(R.id.selectall);
        rowItems = new ArrayList<RowItem>();
        options = new DisplayImageOptions.Builder()
        .showImageOnLoading(R.drawable.ic_stub)
        .showImageForEmptyUri(R.drawable.ic_empty)
        .showImageOnFail(R.drawable.ic_error)
        .cacheInMemory(true)
        .displayer(new RoundedBitmapDisplayer(0))
        .cacheOnDisc(true)
        .build();


        for (int i = 0; i < url.length; i++) {
            RowItem item = new RowItem(url[i]);
            rowItems.add(item);
        }
        mAdapter = new TestAdapter(this,R.layout.list_item, rowItems);
        listView.setHeaderDividersEnabled( true );
        listView.setFooterDividersEnabled( true );
        listView.setAdapter( mAdapter );

        selectAll.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // TODO Auto-generated method stub
                flag = !flag;
                mAdapter.notifyDataSetChanged();
            }
        });
        listView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View view, int position,
                    long arg3) {
                Toast.makeText(getApplicationContext(), position+"", Toast.LENGTH_SHORT).show();
                CheckBox check = (CheckBox)view.findViewById(R.id.radio);
                final Integer index = Integer.valueOf(position);

                if(!checkedPositions.contains(index))
                    checkedPositions.add(index);
                else
                    checkedPositions.remove(index);

                check.setChecked(checkedPositions.contains(index));             
            }
        });

        Log.i( LOG_TAG, "choice mode: " + listView.getChoiceMode() );
    }



    public class TestAdapter extends ArrayAdapter<RowItem> {

        private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();
        Context context;
        protected ImageLoader imageLoader = ImageLoader.getInstance();

        public TestAdapter(Context context, int resourceId,
                List<RowItem> items) {
            super(context, resourceId, items);
            this.context = context;
        }

        /*private view holder class*/
        private class ViewHolder {
            ImageView imageView;
            CheckBox radio1;
        }

        @Override
        public int getViewTypeCount() {
            return 3;
        }

        @Override
        public int getItemViewType( int position ) {
            return position%3;
        }
        ViewHolder holder=null;
        @Override
        public View getView(final int position, View convertView, ViewGroup parent ) {
            RowItem rowItem = getItem(position);
            holder = new ViewHolder();
            final int i = position;
            if (convertView == null) {

                LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
                convertView = mInflater.inflate(R.layout.list_item, null);
                holder.imageView = (ImageView) convertView.findViewById(R.id.icon);
                holder.radio1 = (CheckBox) convertView.findViewById(R.id.radio);
                convertView.setTag(holder);
            } 
            else{
                holder = (ViewHolder) convertView.getTag();
            }

            holder.radio1.setChecked(flag);
            if(flag){
                if(!checkedPositions.contains(position))
                    checkedPositions.add(position);
            }
            else
            {
                checkedPositions.clear();
            }
            final Integer index = Integer.valueOf(position);

            holder.radio1.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton arg0, boolean isChecked) {
                    if(isChecked){
                        if(!checkedPositions.contains(index))
                            checkedPositions.add(index);
                    }
                    else
                        checkedPositions.remove(index);


                }
            });

            imageLoader.displayImage(rowItem.getimageUrl(), holder.imageView, options, animateFirstListener);
            holder.radio1.setChecked(checkedPositions.contains(index));
            return convertView;
        }
    }
    private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener {

        static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>());

        @Override
        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
            if (loadedImage != null) {
                ImageView imageView = (ImageView) view;
                boolean firstDisplay = !displayedImages.contains(imageUri);
                if (firstDisplay) {
                    FadeInBitmapDisplayer.animate(imageView, 5000);
                    displayedImages.add(imageUri);
                }
            }
        }
    }
}

RowItem.class

package it.sephiroth.listviewwithselectallcheckbxox;
public class RowItem {
    private int imageId;
    private String imageUrl;

    public RowItem(int imageId) {
        this.imageId = imageId;
    }

    public RowItem(String imageUrl) {
        this.imageUrl = imageUrl;
    }

    public int getImageId() {
        return imageId;
    }
    public void setImageId(int imageId) {
        this.imageId = imageId;
    }
    public String getimageUrl() {
        return imageUrl;
    }
    public void setimageUrl(String imageUrl) {
        this.imageUrl = imageUrl;
    }
}

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >


        <ListView
            android:id="@+id/hListView1"
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:paddingTop="20dip"
            android:paddingBottom="20dip"
            android:background="#11000000"
             />

        <CheckBox
            android:id="@+id/selectall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_below="@+id/hListView1"
            android:layout_marginLeft="60dp"
            android:layout_marginTop="64dp"
            android:text="selectall" />

</RelativeLayout>

list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

    <ImageView
        android:id="@+id/icon"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:contentDescription="ImageView"
        android:paddingLeft="10dp"
        android:paddingRight="10dp" >
    </ImageView>

    <CheckBox
        android:id="@+id/radio"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/icon"
        android:layout_marginLeft="33dp"
        android:focusable="false"
        android:focusableInTouchMode="false" />

</RelativeLayout>

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="it.sephiroth.android.sample.horizontalvariablelistviewdemo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="19" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application
        android:hardwareAccelerated="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

In the getView(), Add all the position of the checkboxes

ArrayList<Integer> addIndex= new ArrayList<Integer>();//Global
checkedPositions.add(position);

This will contain all the checkboxes position

Use a ArrayList to maintain all the checkbox states in the ListView to keep track of which checkbox is checked with a boolean.

Then when you click on checkAll CheckBox you update all boolean in your list to true and do yourAdapter.notifyDataSetChanged();

ArrayList<Integer> checkedPositions = new ArrayList<Integer>();//Global

Scenario : When Checking individual Checkboxes, adding in array list. The code below is to be added in ListView.setOnItemClickListener()

    final Integer index = Integer.valueOf(position);

    if(!checkedPositions.contains(index))
        checkedPositions.add(index);
    else
        checkedPositions.remove(index);

    check.setChecked(checkedPositions.contains(index));

Scenario 2 : When you check the SelectAll Checkbox.

holder.selectAllCheckbox.setOnCheckedChangeListener() listener

//Write your code here. Write an if condition that matches for the indexes in both the array list i have created and set checked as per your need

Note :- i have used an integer array list. You can use a boolean and do the same steps and the code below:-

if(list.get(position).isChecked()){
    cellHolder.checkBox.setChecked(true);
}
else{
    cellHolder.checkBox.setChecked(false);
}

All the boolean are at true so all the checkBoxes will be checked (the same logic goes for uncheck)

public class Adapter extends ArrayAdapter<TripItem> {
    private final Context context;
    private final ArrayList<CommonExpenseItem> tripExpenseItems;

    public TripsAdapter(Context context, ArrayList<TripItem> values,
            ArrayList<CommonExpenseItem> tripExpenses) {
        super(context, R.layout.expense_list_row, values);
        this.context = context;
        this.tripExpenseItems = tripExpenses;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(R.layout.expense_list_row, parent,
                false);
        return rowView;
    }
}

The above is a simlple custom adapter ,here i am passing values in a arrayList u can pass hashmap simply,

  1. Initially load all the string values in a separate hashmap or pojo obj with another value named as checkBox value as "disabled", and set the adapter ,
  2. Then in the getView method set the name in the text view and get the checkbox string and check the checkbox if the value is enabled or uncheck if the value is disabled.
  3. and also set tag the position to the checkbox, and create oncheckchange listener for the checkbox item inside the getView() and inside that method get the checkbox tag and get the respective hash map or the obj from the arrayList.
  4. And Change the chekcbox value as enabled and notify the data set to be changed.
  5. Finally for ur problem. once the checkbox in main layout is checked get the arraylist and in a for loop get the hash map or the objs and set the checkbox values to "enabled" and notify dataset changed or set a new adapter and populate in the list view. like wise u can get the solution as u required.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM