Nayan Dabhi
Nayan Dabhi

Reputation: 1006

Android : Determine which checkbox is checked in listview from the Main activity button

I have use the following code for ListView with custom adapter. The Code is Working fine for me,

In ListView there is one checkbox, TextView, ImageView and Button in every ListView Row. Data will fetched Through HttpPost method and assign in every row of listview there is no problem.

I want to get the all the checkbox which is checked in listview, Click on Button of Main Activity.

I have read many article and example but could not get the proper answer these.

Code for : MainActivity.java file which button is clicked and give the Toast as "button is clicked".

package com.example.listviewimageloadingexample;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

    // Declare Variables
    JSONObject jsonobject;
    JSONArray jsonarray;
    ListView listview;
    ListViewAdapter adapter;
    ProgressDialog mProgressDialog;
    ArrayList<HashMap<String, String>> arraylist;

    static String RANK = "rank";
    static String COUNTRY = "country";
    static String POPULATION = "population";
    static String FLAG = "flag";
    Button processedAllBtn;
    CheckBox processAll;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        // Get the view from listview_main.xml
        setContentView(R.layout.listview_main);

        processedAllBtn=(Button) findViewById(R.id.btnProcessedAllAbove);
        processedAllBtn.setOnClickListener(this);

        // Locate the listview in listview_main.xml
        listview = (ListView) findViewById(R.id.listview);

        Object obj=(ListViewAdapter)getLastNonConfigurationInstance();
        if(obj==null)
        {
            // Execute DownloadJSON AsyncTask
            new DownloadJSON().execute();
        }
        else
        {
            adapter=(ListViewAdapter)obj;
            setListView();
        }
    }

    @Override
    public void onClick(View arg0) {
        switch(arg0.getId())
        {
            case R.id.btnProcessedAllAbove:
            //Toast.makeText(getApplicationContext(), "button is clicked "+arg0.getId(), Toast.LENGTH_SHORT).show();

            break;
        }
    }

    // DownloadJSON AsyncTask
    private class DownloadJSON extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {

        super.onPreExecute();

        // Create a progressdialog
        mProgressDialog = new ProgressDialog(MainActivity.this);

        // Set progressdialog title
        mProgressDialog.setTitle("Android JSON Parse Tutorial");

        // Set progressdialog message
        mProgressDialog.setMessage("Loading...");
        mProgressDialog.setIndeterminate(false);

        // Show progressdialog
        mProgressDialog.show();
    }

    @Override
    protected Void doInBackground(Void... params) {

        // Create an array
        arraylist = new ArrayList<HashMap<String, String>>();

        // Retrieve JSON Objects from the given URL address
        jsonobject = JSONfunctions.getJSONfromURL("WEBSERVICE_URL");

        try {
            // Locate the array name in JSON
            //jsonarray = jsonobject.getJSONArray("worldpopulation");
            jsonarray = jsonobject.getJSONArray("students");
            String flag="";

            for (int i = 0; i < jsonarray.length(); i++) {
                HashMap<String, String> map = new HashMap<String, String>();
                JSONObject jsonobject = jsonarray.getJSONObject(i);

                JSONObject student_object = jsonobject.getJSONObject("students");

                // Retrive JSON Objects
                map.put("rank", student_object.getString("id"));
                map.put("country", student_object.getString("name"));
                map.put("population", student_object.getString("roll_number"));

                flag = student_object.getString("student_photo");
                flag = flag.replace(" ", "%20");

                map.put("flag", "WEBSERVICE_URL"+flag);
                // Set the JSON Objects into the array
                arraylist.add(map);
            }
        } catch (JSONException e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void args) {

        setListView();

        // Close the progressdialog
        mProgressDialog.dismiss();
    }
}

@Override
public Object onRetainNonConfigurationInstance() {
    return adapter;
}

public void setListView()
{
    if(adapter==null)
    {
        // Pass the results into ListViewAdapter.java
        adapter = new ListViewAdapter(MainActivity.this, arraylist);
    }

    // Set the adapter to the ListView
    listview.setAdapter(adapter);
}
}

Code for : ListAdapter.java File

package com.example.listviewimageloadingexample;

import java.util.ArrayList;
import java.util.HashMap;

import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class ListViewAdapter extends BaseAdapter {

    // Declare Variables
    Context context;
    LayoutInflater inflater;
    ArrayList<HashMap<String, String>> data;
    ImageLoader imageLoader;
    HashMap<String, String> resultp = new HashMap<String, String>();
    boolean[] itemChecked;

    public ListViewAdapter(Context context, ArrayList<HashMap<String, String>> arraylist)
    {
        super();
        this.context = context;
        data = arraylist;
        imageLoader = new ImageLoader(context);
        itemChecked = new boolean[data.size()];
    }

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        return data.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    public class ViewHolder
    {
        TextView rank;
        TextView country;
        TextView population;
        Button processedBtn;
        ImageView flag;
        CheckBox processedCheckBox;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent)
    {
        View view=convertView;
        final ViewHolder viewHolder;
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if(view == null)
        {

            view = inflater.inflate(R.layout.listview_item, null);

            viewHolder= new ViewHolder();

            // Locate the TextViews in listview_item.xml
            viewHolder.rank = (TextView) view.findViewById(R.id.rank);
            viewHolder.country = (TextView) view.findViewById(R.id.country);
            viewHolder.population = (TextView) view.findViewById(R.id.population);

            // Locate the ImageView in listview_item.xml
            viewHolder.flag = (ImageView) view.findViewById(R.id.flag);

            viewHolder.processedBtn = (Button) view.findViewById(R.id.btnProcessed);
            viewHolder.processedCheckBox = (CheckBox)view.findViewById(R.id.processedCheckBox);

            view.setTag(viewHolder);
        }
        else
        {
            viewHolder=(ViewHolder)view.getTag();
        }

        // Get the position
        resultp = data.get(position);

        // Capture position and set results to the TextViews
        viewHolder.rank.setText(resultp.get(MainActivity.RANK));
        viewHolder.country.setText(resultp.get(MainActivity.COUNTRY));
        viewHolder.population.setText(resultp.get(MainActivity.POPULATION));

        // Capture position and set results to the ImageView
        // Passes flag images URL into ImageLoader.class
        imageLoader.DisplayImage(resultp.get(MainActivity.FLAG), viewHolder.flag);

        viewHolder.processedBtn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {

            // Get the position
            resultp = data.get(position);

            Intent intent = new Intent(context, SingleItemView.class);

            // Pass all data rank
            intent.putExtra("rank", resultp.get(MainActivity.RANK));

            // Pass all data country
            intent.putExtra("country", resultp.get(MainActivity.COUNTRY));

            // Pass all data population
            intent.putExtra("population",resultp.get(MainActivity.POPULATION));

            // Pass all data flag
            intent.putExtra("flag", resultp.get(MainActivity.FLAG));

            // Start SingleItemView Class
            context.startActivity(intent);
        }
    });

    viewHolder.processedCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
    {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            // TODO Auto-generated method stub

            itemChecked[position]=(!itemChecked[position]);
            viewHolder.processedCheckBox.setChecked(itemChecked[position]);
        }
        });
        return view;
    }
}

Code for : listitem.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <CheckBox
            android:id="@+id/processedCheckBox"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical|center_horizontal"
            android:saveEnabled="false" />

        <ImageView
            android:id="@+id/flag"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:layout_gravity="center_vertical|center_horizontal"
            android:padding="5dp"/>

        <TextView
            android:id="@+id/rank"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical|center_horizontal"
            android:text="id"
            android:textStyle="bold"
            android:visibility="gone" />

        <TextView
            android:id="@+id/country"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical|center_horizontal"
            android:text="Name"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/population"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical|center_horizontal"
            android:text="Roll_No"
            android:textStyle="bold"
            android:visibility="gone" />

        <Button
            android:id="@+id/btnProcessed"
            android:layout_width="90dp"
            android:layout_height="30dp"
            android:textSize="15sp"
            android:layout_gravity="center_vertical|center_horizontal"
            android:background="@drawable/buttonshape"
            android:text="Processed"
            android:textColor="#FFFFFF"
            android:layout_marginLeft="2dp" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <View
            android:layout_width="fill_parent"
            android:layout_height="1dp"
            android:background="#000000" />

    </LinearLayout>

</LinearLayout>

Code for : listview_main.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ScrollView1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <CheckBox
                android:id="@+id/checkAllAbove"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Select All" />

            <Button
                android:id="@+id/btnProcessedAllAbove"
                android:layout_width="90dp"
                android:layout_height="30dp"
                android:layout_marginLeft="119dp"
                android:background="@drawable/buttonshape"
                android:text="Processed"
                android:textColor="#FFFFFF"
                android:textSize="15sp" />

        </LinearLayout>

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#000000" />

        <ListView
            android:id="@+id/listview"
            android:layout_width="match_parent"
            android:layout_height="320dp" />

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#000000" />

    </LinearLayout>

</ScrollView>

Upvotes: 1

Views: 3947

Answers (3)

Nayan Dabhi
Nayan Dabhi

Reputation: 1006

Thanks to everyone.

I Found answer from these Link. Following code get all the objects from listview.

...
@Override
public void onClick(View arg0)
{
    CheckBox cb;
    for (int x = 0; x <listview.getChildCount();x++)
    {
        TextView tvRank=(TextView)listview.getChildAt(x).findViewById(R.id.rank);
        TextView tvCountry=(TextView)listview.getChildAt(x).findViewById(R.id.country);
        TextView tvPopulation=(TextView)listview.getChildAt(x).findViewById(R.id.population);

        String rank=tvId.getText().toString();
        String country=tvName.getText().toString();
        String population=tvRno.getText().toString();

        cb = (CheckBox)listview.getChildAt(x).findViewById(R.id.processedCheckBox);
        if(cb.isChecked())
        {
            Toast.makeText(getApplicationContext(),rank+"-"+country+"-"+population, Toast.LENGTH_SHORT).show();
        }
    }
}

Upvotes: 2

brummfondel
brummfondel

Reputation: 1210

Take a look on this very good tutorial:

http://www.vogella.com/tutorials/AndroidListView/article.html#listviewselection

It used the setTag() / getTag() functions.

Upvotes: 2

CodeBlake
CodeBlake

Reputation: 184

there is a checkbox getTag() method, use this with some logic and you should be fine

see: http://amitandroid.blogspot.in/2013/03/android-listview-with-checkbox-and.html

Upvotes: 2

Related Questions