Programmatically Select Item Listview in Android

Programmatically select item ListView in Android

This is for everyone trying to :

-Select programmatically an Item in a ListView

-Making this Item stay Highlighted

I'm working on Android ICS, I don't know if it works for all levels Api.

First create a listview (or get it if you're already in a listActivity/listFragment)

Then set the choice mode of your listview to single with :Mylistview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

Then select programmatically your item with :Mylistview.setItemChecked(position, true); (position being an integer indicating the rank of the item to select)

Now your item is actually selected but you might see absolutely nothing because there's no visual feedback of the selection. Now you have two option : you can either use a prebuilt listview or your custom listview.

1) If you want a prebuilt listview, give a try to simple_list_item_activated_1, simple_list_item_checked , simple_list_item_single_choice, etc...

You can set up your listview like this for e.g : setListAdapter(new ArrayAdapter<String>(this, R.layout.simple_list_item_activated_1, data))

following which prebuilt listview you chose you'll see now that when selected you have a checkbox ticked or the backgound color changed , etc...

2) If you use a custom listview then you'll define a custom layout that will be used in each item. In this XML layout you will attribute a selector for each part view in you row which need to be changed when selected.

Let's say that when selected you want your row to change the color of the text and the color of the background. Your XML layout can be written like :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/menu_item_background_selector"
android:orientation="horizontal" >

<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:textColor="@drawable/menu_item_text_selector" />

Now, in the drawable folder you create menu_item_background_selector.xml and menu_item_text_selector.xml.

menu_item_text_selector.xml :

 <?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">

<item android:state_activated="true"
android:color="#FFF">
</item>

<item android:state_pressed="true"
android:color="#FFF">
</item>

<item android:state_pressed="false"
android:color="#000">
</item>

</selector>

The text will be white when selected.

Then do something similar for your background: (remember that you're not forced to use color but you can also use drawables)

menu_item_background_selector.xml :

<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">


<item android:state_activated="true"
android:color="#0094CE">
</item>

<item android:state_pressed="true"
android:color="#0094CE">
</item>

<item android:state_pressed="false"
android:color="#ACD52B">
</item>


</selector>

Here the background is blue when selected and green when it is not selected.

The main element I was missing was android:state_activated. There's indeed (too) many states : activated,pressed,focused,checked,selected...

I'm not sure if the exemple I gave with android:state_activated and android:state_pressed is the best and cleanest one but it seems to work for me.

But I didn't need to make my own class in order to get a Custom CheckableRelativeLayout (which was dirty and scary) nor I used CheckableTextViews. I don't know whyothers used such methods, it maybe depends on the Api level.

Set activated item in ListView programmatically

you can select item with following code:

listView.setItemChecked(position, true);

How do I programmatically select an item in a listview in Android


how then would I go about highlighting
the current program?

Change something in that list row. For example, perhaps you have an icon you can switch to be a "playing" icon, or have an icon that is formerly INVISIBLE become VISIBLE, or something.

Bear in mind that you will need to have these smarts in your row binding code, so that if the user scrolls, you correct undo and redo that setting -- otherwise, row recycling will make it appear that other programs are playing.

Select Item in ListView Programmatically

You have to handle the TextChanged event of your TextBox:

//TextChanged event handler for your textBox1
private void textBox1_TextChanged(object sender, EventArgs e) {
ListViewItem item = listView1.Items.OfType<ListViewItem>()
.FirstOrDefault(x => x.Text.Equals(textBox1.Text, StringComparison.CurrentCultureIgnoreCase));
if (item != null){
listView1.SelectedItems.Clear();
item.Selected = item.Focused = true;
listView1.Focus();//Focus to see it in action because SelectedItem won't look like selected if the listView is not focused.
}
}

You can also use ListView.FindItemWithText method, but notice that it matches the exact string which starts the item text, that means you have to handle the case-sensivity yourself in case you want.



Related Topics



Leave a reply



Submit