pengguang001
pengguang001

Reputation: 4205

ListView, highlight the selected item

I create a ListView in my activity, with another two button (prev, next) to move a highlight on the ListView. When click the two button, I call setSelection(pos), but there's no highlight shown on list view.

I have also tried custom the list item with layout file, and register selectors on it, as described in: http://android-codes-examples.blogspot.com/2011/03/customized-listview-items-selection.html

Unfortunately it is not working as expected. This method did change the color when I touch the list item, but no highlight is shown when I call setSelection().

layout/main.xml (main layout):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:weightSum="4"
    >
    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1" />
    <LinearLayout
        android:orientation="vertical"
        android:weightSum="2"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:layout_weight="3">
        <Button
            android:id="@+id/btn_prev"
            android:text="prev"
            android:layout_width="fill_parent"
            android:layout_height="match_parent"
            android:layout_weight="1" />
        <Button
            android:id="@+id/btn_next"
            android:text="next"
            android:layout_width="fill_parent"
            android:layout_height="match_parent"
            android:layout_weight="1" />
    </LinearLayout>
</LinearLayout>

List.java (Activity):

package com.android.list;

import android.app.Activity;
import android.os.Bundle;

import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.TableRow;
import android.widget.SimpleAdapter;
import android.widget.SimpleAdapter.ViewBinder;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.graphics.Point;
import android.graphics.Color;

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

public class List extends Activity
    implements View.OnClickListener
{
    private ArrayList<HashMap<String, String>> mList;
    private Button mPrev;
    private Button mNext;
    private ListView mListView;
    private int mPosition;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mList = new ArrayList<HashMap<String, String>>();
        HashMap<String, String> map;
        String[] ent = { "USA","India","England","Russia","Europe","Canada","Srilanka","Singapore","Thailand","Australia"};
        for (int i=0; i<ent.length; i++)
        {
            map = new HashMap<String, String>();
            map.put("content", ent[i]);
            mList.add(map);
        }
        SimpleAdapter adapter = new SimpleAdapter(this,
            mList, R.layout.list_item, 
            new String[] {"content"}, 
            new int[] {R.id.list_text});
        mListView = (ListView) findViewById(R.id.list_view);
        mListView.setAdapter(adapter);
        mPosition = 0;
        mListView.setSelection(mPosition);

        mPrev = (Button) findViewById(R.id.btn_prev);
        mPrev.setOnClickListener(this);
        mNext = (Button) findViewById(R.id.btn_next);
        mNext.setOnClickListener(this);
    }

    public void onClick(View view)
    {
        if (view == mPrev && mPosition >= 0)
        {
            mListView.setSelection(mPosition);
            mPosition--;
        }
        else if (view == mNext && mPosition < mList.size())
        {
            mListView.setSelection(mPosition);
            mPosition++;
        }
    }
}

layout/list_item.xml (list item layout):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:chess="http://schemas.android.com/apk/res/org.pengguang.chess"
    android:orientation="vertical"
    android:background="@color/list_bg"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
<TextView
    android:id="@+id/list_text"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />
</LinearLayout>

color/list_bg.xml (list item selector):

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

<item  
    android:state_selected="false"
    android:state_pressed="false" 
    android:drawable="@color/grey" />
<item 
    android:state_pressed="true" 
    android:drawable="@color/blue" />
<item 
    android:state_selected="true"
    android:state_pressed="false" 
    android:drawable="@color/red" />

</selector>

values/colors.xml (color file):

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <color name="blue">#0303ff</color>
    <color name="grey">#f7f7f7</color>
    <color name="red">#ff0000</color>
</resources>

Upvotes: 5

Views: 5961

Answers (3)

FireDevil
FireDevil

Reputation: 129

Very easy way to highlight an item:

 lv.setItemChecked(ItemIndex,true);

but this item keeps selected(highlighted) until you set

 lv.setItemChecked(ItemIndex,false);

Upvotes: 0

PravinCG
PravinCG

Reputation: 7708

This is the intended behavior. Not sure why are you using the buttons for changing the selection?

You should possibly use single Choice Radiogroup which would show different selections.

Upvotes: 0

jsaye
jsaye

Reputation: 914

I haven't try it.

listView.setOnItemSelectedListener(new OnItemSelectedListener() {

                public void onItemSelected(AdapterView<?> arg0, View arg1,
                        int arg2, long arg3) {
                    // TODO Auto-generated method stub
                    arg1.setSelected(true);
                }

                public void onNothingSelected(AdapterView<?> arg0) {
                    // TODO Auto-generated method stub

                }

            })

Upvotes: 3

Related Questions