Android ListView所选项目保持突出显示

Cel*_*lta 74 java android android-listview

我有一个XML带有两个ListView,一个带有由select查询(lv_cli)填充的客户端列表,另一个带有客户端选择的详细信息(lv_cli_det).我想lv_clilv_cli_det显示详细信息的同时保持客户端的选择.

XML:

<ListView
    android:id="@+id/cli_lista"
    android:layout_width="512dp"
    android:layout_height="wrap_content"
    android:fadeScrollbars="false"
    >
</ListView>

<ListView
    android:id="@+id/cli_lista_det"
    android:layout_width="512dp"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@+id/cli_lista"
    android:fadeScrollbars="false" >
</ListView>
Run Code Online (Sandbox Code Playgroud)

Java的:

Cursor cursor = db.rawQuery("Select NrCl||';'||Nome From Clientes", null);
final ListView t = (ListView)findViewById(R.id.cli_lista);
ArrayAdapter<String> myarrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, listItems);
t.setAdapter(myarrayAdapter);

final ListView td = (ListView)findViewById(R.id.cli_lista_detalhe);
final ArrayAdapter<String> myarrayAdapter2 = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, listItems2);

t.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        String item = ((TextView)view).getText().toString();
        String[] strArray = item.split("\\;");

        cli.load(strArray[0].toString());
        td.setAdapter(myarrayAdapter2);
        listItems2.clear();
        listItems2.add("Nome: " + cli.getNome());
        listItems2.add("Morada: " + cli.getMorada());
        listItems2.add("Localidade: " + cli.getLoca());
        listItems2.add("Código Postal: " + cli.getCp());
        listItems2.add("Pais: " + cli.getPais());
        listItems2.add("Nif: " + cli.getNif());
        listItems2.add("Tel: " + cli.getTel());
        listItems2.add("Tlm: " + cli.getTlm());
        listItems2.add("Tipo Preço: " + cli.getTipoPvn());
        listItems2.add("Cond. Pagamento: " + cli.getCpg());
        listItems2.add("Obs: " + cli.getObs());
        td.setAdapter(myarrayAdapter2);
        myarrayAdapter2.notifyDataSetChanged(); 
    }
});
Run Code Online (Sandbox Code Playgroud)

小智 159

找到了正确的方法.这很简单.在资源描述如下:

android:choiceMode="singleChoice"
android:listSelector="#666666"
Run Code Online (Sandbox Code Playgroud)

(或者您可以指定资源链接而不是颜色值)

的程序化:

listView.setSelector(Drawable selector)
listView.setSelector(int resourceId)
listView.setChoiceMode(int mode)
Run Code Online (Sandbox Code Playgroud)

模式可以是以下之一:AbsListView.CHOICE_MODE_SINGLE,AbsListView.CHOICE_MODE_MULTIPLE,AbsListView.CHOICE_MODE_NONE(默认)

(AbsListView是ListView类的抽象祖先)

使用onItemClick和更改视图背景的PS操作已破产,因为视图本身是临时对象.因此,您不得跟踪视图.

如果我们的列表足够长,则与滚动项目关联的视图将从层次结构中删除,并且将在再次显示这些项目时重新创建(使用缓存的显示选项,例如背景).因此,我们跟踪的视图现在不是项目的实际视图,更改其背景对实际项目视图没有任何作用.因此,我们选择了多个项目.

  • 这应该是接受的答案.简单而高效. (15认同)
  • @AJG如果我将模式更改为单个到多个,则不起作用.它仅显示最后一个选定的项目.但我希望如果我选择三个项目,那么所有三个项目都必须着色. (3认同)
  • 简单优雅的答案! (2认同)

Neo*_*eoh 131

要在按下列表视图项时保持其颜色,请在列表视图项布局中包含以下行:

android:background="@drawable/bg_key"
Run Code Online (Sandbox Code Playgroud)

然后bg_key.xmldrawable文件夹中定义如下:

<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item 
        android:state_selected="true"
        android:drawable="@color/pressed_color"/>
    <item
        android:drawable="@color/default_color" />
</selector>
Run Code Online (Sandbox Code Playgroud)

最后,将此包含在您的ListView onClickListener:

listView.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,long arg3) {
        view.setSelected(true);
        ... // Anything
    }
});
Run Code Online (Sandbox Code Playgroud)

这样,任何时候都只会选择一个项目进行颜色选择.您可以使用以下内容定义颜色值res/values/colors.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="pressed_color">#4d90fe</color>
    <color name="default_color">#ffffff</color>
</resources>
Run Code Online (Sandbox Code Playgroud)

  • 颜色名称只是示例。它表明您可以1)以png格式创建一个9patch彩色图像,然后将其放入drawable文件夹中,或者2)您可以在res/values/colors.xml中定义颜色,然后使用android:drawable="@颜色/你的颜色”。如果它不存在,您将需要首先创建colors.xml。 (2认同)

Chr*_*623 37

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            for (int j = 0; j < adapterView.getChildCount(); j++)
                adapterView.getChildAt(j).setBackgroundColor(Color.TRANSPARENT);

            // change the background color of the selected element
            view.setBackgroundColor(Color.LTGRAY);
});
Run Code Online (Sandbox Code Playgroud)

也许您可能希望使用索引i将当前所选元素保存在全局变量中.

  • 键盘显示时会发生奇怪的事情.发生多选. (5认同)

Ash*_*kol 13

简单的方法是,如果您在xml中使用listview,请在listview上使用此属性,

android:choiceMode="singleChoice"
android:listSelector="#your color code"
Run Code Online (Sandbox Code Playgroud)

如果不是通过编程使用xml

listview.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
listview.setSelector(android.R.color.holo_blue_light);
Run Code Online (Sandbox Code Playgroud)

  • 你有点晚了.AJG的答案可以在您的答案提前一年以上,并且更完整. (10认同)

小智 5

您需要这样的选择器:

<selector xmlns:android="http://schemas.android.com/apk/res/android">

<!-- State when a row is being pressed, but hasn't yet been activated (finger down) -->
<item android:drawable="@color/app_primary_color_light" android:state_pressed="true" />

<!-- Used when the view is "activated". -->
<item android:drawable="@color/app_primary_color" android:state_activated="true" />

<!-- Default, "just hangin' out" state. -->
<item android:drawable="@android:color/transparent" /></selector>
Run Code Online (Sandbox Code Playgroud)

然后设置android:choiceMode="singleChoice"为您的ListView。