ListView,如何突出显示所选项目

5
我在活动中创建了一个ListView,并添加了另外两个按钮(prev,next)以移动listview上的高亮显示。当点击这两个按钮时,我调用了setSelection(pos)函数,但是list view上没有显示出高亮。
我也尝试了使用布局文件自定义列表项,并在其中注册selectors,如下所述:http://android-codes-examples.blogspot.com/2011/03/customized-listview-items-selection.html 不幸的是,这种方法并没有像预期的那样工作。当我触摸列表项时,颜色确实改变了,但是调用setSelection()函数时没有显示高亮。 layout/main.xml (主要布局):
<?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(活动):

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(列表项布局):

<?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(列表项选择器):

<?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(颜色文件):

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

3

我还没有尝试过它。

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

                }

            })

我刚才尝试了一下,onItemSelected没有被触发。从sdk文档来看:"onItemSelected():设置当前选定的项目。如果处于触摸模式,则不会选择该项目,但它仍将被适当地定位。"所以我们应该关闭列表视图的触摸模式吗? - pengguang001
经过仔细考虑,我们决定在用户通过触摸屏幕操作UI时完全删除选择。在触摸模式下,没有焦点和选择。在列表或网格中选择的任何选定项目在用户进入触摸模式时都会变为未选中状态。同样,当用户进入触摸模式时,任何具有焦点的小部件都将失去焦点。下面的图片说明了当用户在使用轨迹球选择项目后触摸列表时会发生什么。 - jsaye
新的Android开发人员经常遇到的一个常见问题是依赖于ListView.getSelectedItemPosition()。在触摸模式下,该方法将返回INVALID_POSITION。相反,您应该使用点击监听器(请参见setOnItemClickListener(android.widget.AdapterView.OnItemClickListener))或选择模式(请参见setChoiceMode(int))。 - jsaye
2
谢谢!我刚刚看到了这个。现在我有一个解决方法:在按钮的onClick中,调用mListView.getChildAt(pos).setBackgroundColor(color)。我还必须设置所有其他项目的背景,否则会有多个被设置为高亮显示。 - pengguang001

0
非常容易突出显示一个项目的方法:
 lv.setItemChecked(ItemIndex,true);

但是这个项目会一直保持选中状态,直到你进行设置

 lv.setItemChecked(ItemIndex,false);

0

这是预期的行为。不确定为什么要使用按钮来更改选择?

您可能应该使用单选Radiogroup,它会显示不同的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接