我有一个XML
,其中包含两个ListView
,其中一个包含由选择查询填充的客户端列表(lv_cli
),另一个包含所选客户端的详细信息(lv_cli_det
)。我希望在lv_cli
中选择客户端,而lv_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>
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();
}
});
我找到了正确的方法。这很简单。在资源中描述以下内容:
android:choiceMode="singleChoice"
android:listSelector="#666666"
(或者您可以指定资源链接而不是颜色值)
程序:
listView.setSelector(Drawable selector);
listView.setSelector(int resourceId);
listView.setChoiceMode(int mode);
模式可以是以下之一:AbsListView.CHOICE_MODE_SINGLE,AbsListView.CHOICE_MODE_MULTIPLE,AbsListView.CHOICE_MODE_NONE(默认)
(AbsListView 是 ListView 类的抽象祖先)
P.S .用onItemClick和改变视图背景的操作是破产的,因为视图本身是一个临时对象。因此,您一定不要跟踪视图。
如果我们的列表足够长,与滚动出的项目相关联的视图将从层次结构中移除,并且将在这些项目再次显示时重新创建(带有缓存的显示选项,如背景)。因此,我们跟踪的视图现在不是该项目的实际视图,并且更改其背景对实际项目视图没有任何影响。因此,我们选择了多个项目。
要在按下列表视图项时保持其颜色,请在列表视图项布局中包含以下行:
android:background="@drawable/bg_key"
然后在可绘制
文件夹中定义bg_key.xml
,如下所示:
<?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>
最后,将它包含在您的< code > ListView < code > onclick listener 中:
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,long arg3) {
view.setSelected(true);
... // Anything
}
});
这样,任何时候都只能选择一个项目的颜色。您可以在res/value/colors.xml
中定义您的颜色值,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="pressed_color">#4d90fe</color>
<color name="default_color">#ffffff</color>
</resources>
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);
});
也许您可能希望使用索引i将当前选定的元素保存在全局变量中。