Using hashMaps in custom adapters for listView

11,557

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;
    }
}
Share:
11,557

Related videos on Youtube

Rakeeb Rajbhandari
Author by

Rakeeb Rajbhandari

Currently working at YoungInnovations as an Android developer, I also freelance, contact me :)

Updated on June 04, 2022

Comments

  • Rakeeb Rajbhandari
    Rakeeb Rajbhandari almost 2 years

    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.

  • Rakeeb Rajbhandari
    Rakeeb Rajbhandari over 10 years
    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 ?
  • Rakeeb Rajbhandari
    Rakeeb Rajbhandari over 10 years
    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 ?
  • Mukesh Kumar Singh
    Mukesh Kumar Singh over 10 years
    it can, just set text of check box from hashMap data and set onCheckedChanged listener in getView();
  • Rakeeb Rajbhandari
    Rakeeb Rajbhandari over 10 years
    what do you recommend for an ArrayList<HashMap<String,String>>