2

The following is the code that I am currently using for a listView:

private class Asyncprojectlist extends AsyncTask<Void, Void, Void>{
        JSONArray JSar;
        JSONObject JSob;
        String project_title, project_sector;
        @Override
        protected void onPreExecute() {
            progressDialog =  new ProgressDialog(Allprojects.this);
            progressDialog.setCancelable(false);
            progressDialog.setMessage("Loading...");
            progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
            progressDialog.setProgress(0);
            progressDialog.show();
        }

        @Override
        protected Void doInBackground(Void... params) {
            UserFunctions user = new UserFunctions();
            JSob = user.allprojects();
            try {
                JSar = JSob.getJSONArray("data");

            } catch (JSONException e1) {
                e1.printStackTrace();
            }
            for(int i=0; i<JSar.length(); i++){
                try {
                    JSONObject newobj = JSar.getJSONObject(i);
                    project_title = newobj.getString("title");
                    project_sector = newobj.getString("sector");

                    HashMap<String, String> single = new HashMap<String, String>();
                    single.put("title", project_title);
                    single.put("sector", project_sector);

                    all_list.add(single);

                } catch (JSONException e) {
                    e.printStackTrace();
                }

            }
//          Log.i("json object", JSar.toString());
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            ListAdapter adapter = new SimpleAdapter(getApplicationContext(), all_list, R.layout.projectlist_frame, 
                    new String[]{"title","sector"}, new int[]{R.id.projecttitle, R.id.projectsector});
            setListAdapter(adapter);
            progressDialog.dismiss();
            list = getListView();
            list.setOnItemClickListener(new AdapterView.OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> parent, View viewClicked,
                        int position, long id) {

                    Intent toindividual = new Intent(Allprojects.this, Individual_project.class);
                    try {
                        toindividual.putExtra("nid", JSar.getJSONObject(position).getString("id"));
                        startActivity(toindividual);

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            });

}

Here the an api is being called upon to fetch data and the all_list is an ArrayList<HashMap<>> where it is used by the SimpleAdapter to assign values such as projectTitle and projectStatus on the listView layout. Everything here works perfectly. But I am having a hard time implementing the checkBox listener which is in the listView's layout. I believe that a custom adapter is needed. In my attempt to build a custom adapter I could not come up with a working code. Please help in implementing a custom adapter so that the listView can have the checkBox's CheckChangeListener implemented.

1

2 Answers 2

9

you can create a custome adapter for it. In this adapter you have to set CheckChangeListener on checkbox in getView method.

public class MyBaseAdapter extends BaseAdapter {

    private Context mContext;
    private LayoutInflater mInflater;

    public MyBaseAdapter(Context context) {

        this.mContext = context;
        mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        if (convertView == null) {
            holder = new ViewHolder();
            convertView = mInflater.inflate(R.layout.row_layout, null);

            holder.txtName = (TextView) convertView.findViewById(R.id.textView1);
            holder.chkTick = (CheckBox) convertView.findViewById(R.id.checkBox1);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        final int pos = position;
        holder.txtName.setText("ABC");
        holder.chkTick.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked) {
                    Toast.makeText(mContext, "Checked", Toast.LENGTH_SHORT).show(); 
                }
            }
        });

        return convertView;
    }
}

You may also check this link1,link2 for more details

You can use hashMap for custome adapter and set value in UI as follow

public class HashMapAdapter extends BaseAdapter {

    private HashMap<String, String> mData = new HashMap<String, String>();
    private String[] mKeys;
    public HashMapAdapter(HashMap<String, String> data){
        mData  = data;
        mKeys = mData.keySet().toArray(new String[data.size()]);
    }

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

    @Override
    public Object getItem(int position) {
        return mData.get(mKeys[position]);
    }

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

    @Override
    public View getView(int pos, View convertView, ViewGroup parent) {
        String key = mKeys[pos];
        String Value = getItem(pos).toString();

        //do your view stuff here

        return convertView;
    }
}
Sign up to request clarification or add additional context in comments.

4 Comments

hmmm ... alls good but i am having problem creating a custom adapter for listView items that take hashMap values for the layout to inflate ... any suggestions on that ?
thank you ... but i still have another question ... does the same apply in the hashMaps if i were to add an checkBox on click listener ?
it can, just set text of check box from hashMap data and set onCheckedChanged listener in getView();
what do you recommend for an ArrayList<HashMap<String,String>>
0

try setting list adapter using

ListView myList=(ListView)findViewById(android.R.id.list);
myList.setAdapter(adapter);

instead of

setListAdapter(adapter);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.