Java Android ListView 选中项保持高亮
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16189651/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Android ListView selected item stay highlighted
提问by Celta
I have an XML
with two ListView
, one with a list of clients filled by a select query (lv_cli
) and the other with the details of the client selected (lv_cli_det
).
I would like to keep the client selected in the lv_cli
while the lv_cli_det
show the details.
我有XML
两个ListView
,一个是由选择查询 ( lv_cli
)填充的客户列表,另一个是所选客户的详细信息 ( lv_cli_det
)。我想lv_cli
在lv_cli_det
显示细节的同时保持选择客户端。
XML:
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();
}
});
采纳答案by Neoh
To hold the color of listview item when you press it, include the following line in your listview item layout:
要在按下时保持列表视图项的颜色,请在列表视图项布局中包含以下行:
android:background="@drawable/bg_key"
Then define bg_key.xml
in drawable
folder like this:
然后bg_key.xml
在drawable
文件夹中定义如下:
<?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>
Finally, include this in your ListView
onClickListener
:
最后,将其包含在您的ListView
onClickListener
:
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,long arg3) {
view.setSelected(true);
... // Anything
}
});
This way, only one item will be color-selected at any time. You can define your color values in res/values/colors.xml
with something like this:
这样,任何时候都只会选择一项颜色。您可以使用以下内容定义颜色值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>
回答by Tristan Vanderaerden
One way you can do this, is to Keep track of the current selected position in your activity:
您可以这样做的一种方法是跟踪您活动中当前选定的位置:
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long arg3) {
currentPosition = position
lv_cli.notifyDataSetChanged();
}
Now, be sure you assign an ID to the parent layout (linearLayout, boxLayout, relativeLayout, .. Whatever you prefer) of your list item.
现在,请确保为列表项的父布局(linearLayout、boxLayout、relativeLayout 等等)分配一个 ID。
Then in your ListView you can do something Like this:
然后在你的 ListView 你可以做这样的事情:
layoutBackground = (LinearLayout) convertView.findViewById(R.id.layout_background);
if (YourActivity.this.currentPosition == position) {
layoutBackground.setBackgroundColor(YourActivity.this.getResources().getColor(R.color.hilight_color));
} else{
layoutBackground.setBackgroundResource(R.drawable.list_item_drawable);
}
Basically, you just set the hilight color to the layout as a background when it equals your current selected position. Notice how I set a drawable background resource when the item is not selected. This could be in your case different (since you posted no code). In my case, this drawable is a selector which makes sure the item is hi-lighted when pressed.
基本上,您只需将高亮颜色设置为布局作为背景,当它等于您当前选择的位置时。请注意我如何在未选择项目时设置可绘制背景资源。这在您的情况下可能有所不同(因为您没有发布代码)。在我的例子中,这个 drawable 是一个选择器,它确保项目在按下时被高亮显示。
NOTE: This simple code doesn't use a view-holder, but I really recommend using one.
注意:这个简单的代码不使用视图持有者,但我真的建议使用一个。
回答by Tristan Vanderaerden
From Avinash Kumar Pankaj's example
来自 Avinash Kumar Pankaj 的例子
View v;
then at oncreate method
然后在 oncreate 方法
v = new View(getActivity());
and then onlistitemclick method i wrote
然后我写的 onlistitemclick 方法
public void onListItemClick(ListView listView, View view, int position,
long id) {
v.setBackgroundResource(0);
view.setBackgroundResource(R.color.green);
v = view;
}
It worked for me. Thank you.
它对我有用。谢谢你。
I replaced
我换了
v = new View(getActivity());
to
到
v = new View(this);
and the code worked well.
并且代码运行良好。
It is necessary the xml files 'colors' and 'bg_key' from previous examples too, as well as ListView attribute android:background="@drawable/bg_key"
前面示例中的 xml 文件 'colors' 和 'bg_key' 也是必要的,以及 ListView 属性 android:background="@drawable/bg_key"
Mauro
毛罗
回答by Chris623
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);
});
Perhaps you might want to save the current selected element in a global variable using the index i.
也许您可能希望使用索引 i 将当前选定的元素保存在全局变量中。
回答by AJG
I found the proper way. It's very simple. In resource describe following:
我找到了正确的方法。这很简单。在资源中描述以下内容:
android:choiceMode="singleChoice"
android:listSelector="#666666"
(or you may specify a resource link instead of color value)
(或者您可以指定资源链接而不是颜色值)
Programmatical:
程序化:
listView.setSelector(Drawable selector);
listView.setSelector(int resourceId);
listView.setChoiceMode(int mode);
mode can be one of these: AbsListView.CHOICE_MODE_SINGLE, AbsListView.CHOICE_MODE_MULTIPLE, AbsListView.CHOICE_MODE_NONE (default)
mode 可以是以下之一:AbsListView.CHOICE_MODE_SINGLE、AbsListView.CHOICE_MODE_MULTIPLE、AbsListView.CHOICE_MODE_NONE(默认)
(AbsListView is the abstract ancestor for the ListView class)
(AbsListView 是 ListView 类的抽象祖先)
P.S. manipulations with onItemClick and changing view background are bankrupt, because a view itself is a temporary object. Hence you must not to track a view.
使用 onItemClick 和更改视图背景的 PS 操作破产了,因为视图本身是一个临时对象。因此,您不能跟踪视图。
If our list is long enough, the views associated with scrolled out items will be removed from hierarchy, and will be recreated when those items will shown again (with cached display options, such as background). So, the view we have tracked is now not an actual view of the item, and changing its background does nothing to the actual item view. As a result we have multiple items selected.
如果我们的列表足够长,与滚动出的项目相关联的视图将从层次结构中删除,并在这些项目再次显示时重新创建(使用缓存的显示选项,例如背景)。因此,我们跟踪的视图现在不是项目的实际视图,更改其背景对实际项目视图没有任何影响。因此,我们选择了多个项目。
回答by Крум Илиев
You need selector like this:
你需要这样的选择器:
<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>
And then set android:choiceMode="singleChoice"
to your ListView.
然后设置android:choiceMode="singleChoice"
为您的 ListView。
回答by Ashana.Hymanol
Simplistic way is,if you are using listview in a xml,use this attributes on your listview,
简单的方法是,如果您在 xml 中使用 listview,请在您的 listview 上使用此属性,
android:choiceMode="singleChoice"
android:listSelector="#your color code"
if not using xml,by programatically
如果不使用 xml,通过编程方式
listview.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
listview.setSelector(android.R.color.holo_blue_light);
回答by ShahinFasihi
*please be sure there is no Ripple at your root layout of list view container
*请确保列表视图容器的根布局中没有 Ripple
add this line to your list view
将此行添加到您的列表视图
android:listSelector="@drawable/background_listview"
here is the "background_listview.xml" file
这是“background_listview.xml”文件
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/white_background" android:state_pressed="true" />
<item android:drawable="@color/primary_color" android:state_focused="false" /></selector>
the colors that used in the background_listview.xml file :
background_listview.xml 文件中使用的颜色:
<color name="primary_color">#cc7e00</color>
<color name="white_background">#ffffffff</color>
after these
在这些之后
(clicked item contain orange color until you click another item)
(单击的项目包含橙色,直到您单击另一个项目)
回答by Wasiun A. Khan
Use the id instead:
改用 id:
This is the easiest method that can handle even if the list is long:
这是即使列表很长也可以处理的最简单的方法:
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
Holder holder=new Holder();
View rowView;
rowView = inflater.inflate(R.layout.list_item, null);
//Handle your items.
//StringHolder.mSelectedItem is a public static variable.
if(getItemId(position)==StringHolder.mSelectedItem){
rowView.setBackgroundColor(Color.LTGRAY);
}else{
rowView.setBackgroundColor(Color.TRANSPARENT);
}
return rowView;
}
And then in your onclicklistener:
然后在您的 onclicklistener 中:
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
StringHolder.mSelectedItem = catagoryAdapter.getItemId(i-1);
catagoryAdapter.notifyDataSetChanged();
.....