ListView setChoiceMode not showing up





(5)


Calling setChoiceMode is not enough to display checkboxes beside your list rows. If you are using a basic layout for the rows, try android.R.layout.simple_list_item_multiple_choice. Else, you will have to add a checkbox to your row layout & manage its on/off state yourself in the adapter's getView method.

HTH,

Akshay

P.S: call setChoiceMode(ListView.CHOICE_MODE_MULTIPLE) instead of setChoiceMode(2) .

I have a ListView that is put together using a special adapter so that I can show every other listview in a different color. How do I write my code so that I am able to see a checklist without having to extend ListActivity (my activity only extends Activity) Here is my code.

 public class TrackingMe extends Activity {

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

    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

    setContentView(R.layout.trackingme_layout);

    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,
            R.layout.custom_title_3);

    SharedPreferences prefs = getSharedPreferences("Settings", 0);
    final String id = prefs.getString("ID", "");

    final TextView myTitleText = (TextView) findViewById(R.id.tvTitle3);
    if (myTitleText != null)
        myTitleText.setText(getResources().getString(R.string.Trackingme));

    ImageButton addFriends = (ImageButton) findViewById(R.id.btnAddFriends);
    addFriends.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            Intent addFriends = new Intent("com.cellphone.INVITEFOLLOWER");
            startActivity(addFriends);
        }
    });

    final ListView lv2 = (ListView) findViewById(R.id.trackingmelistview);
    lv2.setChoiceMode(2);
    lv2.setTextFilterEnabled(true);
    refreshList(id,lv2);

    ImageButton refresh = (ImageButton) findViewById(R.id.btnRefresh2);
    refresh.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub

            refreshList(id, lv2);

        }
    });
}

static final ArrayList<HashMap<String, String>> list2 = new ArrayList<HashMap<String, String>>();

private void refreshList(String id, ListView lv) {
    // removes the list and rebuilds it will choose different response
    // string to get the refreshed times.
    DefaultHttpClient httpclient = new DefaultHttpClient();
    HttpPost httpost = new HttpPost(
            "http://iphone-radar.com/people_i_follow");

    JSONObject holder = new JSONObject();
    try {
        holder.put("userid", id);
        // pacific time zone for now

        StringEntity se = new StringEntity(holder.toString());
        httpost.setEntity(se);
        httpost.setHeader("Accept", "application/json");
        httpost.setHeader("Content-type", "application/json");

        ResponseHandler responseHandler = new BasicResponseHandler();
        final String response = httpclient
                .execute(httpost, responseHandler);
        list2.removeAll(list2);


        SpecialAdapter adapter = new SpecialAdapter(this, list2,
                R.layout.trackingme_row_layout, new String[] { "name" }, new int[] { R.id.tvTrackingMeNames});


        org.json.JSONObject obj = new org.json.JSONObject(response);
        JSONArray tracking_users = obj.getJSONArray("d");

        for (int i = 0; i < tracking_users.length(); i++) {
            // for loop to get all data
            HashMap<String, String> temp = new HashMap<String, String>();
            JSONObject user = tracking_users.getJSONObject(i);
            temp.put("name", user.getString("full_name"));
            list2.add(temp);
            // upload location time

        }

        lv.setAdapter(adapter);
    } catch (JSONException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

}
    //here is the special adapter so that everyother line is a different color
    public class SpecialAdapter extends SimpleAdapter {
private int[] colors = new int[] { Color.GRAY, Color.WHITE };

public SpecialAdapter(Context context,
        ArrayList<HashMap<String, String>> list, int resource,
        String[] from, int[] to) {
    super(context, list, resource, from, to);

}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = super.getView(position, convertView, parent);
    int colorPos = position % colors.length;
    view.setBackgroundColor(colors[colorPos]);
    return view;
}
  }

So far it shows up as a line of text based on what I get from my source. However, when I click on individual lines, they don't highlight and even though I wrote lv.setChoiceMode(2), there was no checkbox next to the listview. Thanks

EDIT here is my trackingme_row_layout.xml

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

    <TextView 
        android:id="@+id/tvTrackingMeNames"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="31dp"              
        android:text="TextView"  
        android:textAppearance="?android:attr/textAppearanceMedium"  
        android:textColor="#000000"/>

</RelativeLayout>

and trackingme_layout.xml

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

    <ListView   
        android:id="@+id/trackingmelistview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:paddingTop="10dp"/>

    <ImageButton 
        android:id="@+id/btnRefresh2" 
        android:text="Refresh" 
        android:src="@android:drawable/stat_notify_sync" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_alignParentBottom="true" 
        android:layout_alignParentLeft="true"/>

</RelativeLayout>



I believe that you have to use a widget that implements Checkable. Try with android.R.layout.simple_list_item_multiple_choice. If you need two lines then implement something similar.







Android - setChoiceMode on custom ListView = no effect

Instead of your code:

if (checkBox != null)
        checkBox.toggle();

Try something like this:

if (checkBox != null) checkBox.setChecked(l.getCheckedItemPositions().get(position));

If you can - improve yur code (create CheckableFrameLayout as parent layout of your List Item). ListView keep BooleanSparseArray of checked positions (you can get it with method getCheckedItemPositions()). In code (grepcode) it set View checked or not by itself only if View is implementing Checkable. If create CheckableFrameLayout and sat as main parent, you do not have to handle these cases in the adapter.




android:cacheColorHint="#00000000"// setting transparent color

or

don't set background of listview.