我有一个XML
有两个ListView
,一个有一个客户列表,由一个选择查询填充(lv_cli
),另一个有客户选择的详细信息({{ 1}})。
我希望在lv_cli_det
显示详细信息的同时保留客户端lv_cli
。
XML:
lv_cli_det
爪哇:
<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>
答案 0 :(得分:158)
找到正确的方法。这很简单。 在资源描述如下:
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进行操作并更改视图背景是破产的,因为视图本身是一个临时对象。因此,您不得跟踪视图。
如果我们的列表足够长,则与滚动项相关联的视图将从层次结构中删除,并且将在再次显示这些项时重新创建(使用缓存的显示选项,例如背景)。因此,我们跟踪的视图现在不是项目的实际视图,更改其背景对实际项目视图没有任何作用。因此,我们选择了多个项目。
答案 1 :(得分:128)
要在按下它时保持listview项目的颜色,请在listview项目布局中包含以下行:
android:background="@drawable/bg_key"
然后在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>
最后,请在ListView
onClickListener
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,long arg3) {
view.setSelected(true);
... // Anything
}
});
这样,任何时候都只会选择一个项目进行颜色选择。您可以使用以下内容在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>
答案 2 :(得分:36)
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将当前所选元素保存在全局变量中。
答案 3 :(得分:13)
简单的方法是,如果您在xml中使用listview,请在listview上使用此属性,
android:choiceMode="singleChoice"
android:listSelector="#your color code"
如果不是以编程方式使用xml
listview.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
listview.setSelector(android.R.color.holo_blue_light);
答案 4 :(得分:4)
你需要这样的选择器:
<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>
然后将android:choiceMode="singleChoice"
设置为ListView。
答案 5 :(得分:2)
来自Avinash Kumar Pankaj的例子
View v;
然后在oncreate方法
v = new View(getActivity());
然后我写了onlistitemclick方法
public void onListItemClick(ListView listView, View view, int position,
long id) {
v.setBackgroundResource(0);
view.setBackgroundResource(R.color.green);
v = view;
}
它对我有用。谢谢。
我替换了
v = new View(getActivity());
到
v = new View(this);
并且代码运作良好。
以前的例子中的xml文件'colors'和'bg_key'也是必要的,以及ListView属性android:background =“@ drawable / bg_key”
莫罗
答案 6 :(得分:2)
*请确保列表视图容器的根布局中没有Ripple
将此行添加到列表视图
android:listSelector="@drawable/background_listview"
这是&#34; background_listview.xml&#34;档案
<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>
background_listview.xml文件中使用的颜色:
<color name="primary_color">#cc7e00</color>
<color name="white_background">#ffffffff</color>
之后
(点击的项目包含橙色,直到您点击另一个项目)
答案 7 :(得分:1)
您可以采取的一种方法是跟踪活动中当前所选的位置:
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long arg3) {
currentPosition = position
lv_cli.notifyDataSetChanged();
}
现在,请务必为您的列表项的父布局(linearLayout,boxLayout,relativeLayout,...,无论您喜欢什么)分配ID。
然后在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);
}
基本上,只需将hilight颜色设置为背景,当它等于当前所选位置时。 请注意在未选择项目时如何设置可绘制的背景资源。这可能与您的情况不同(因为您没有发布任何代码)。在我的情况下,这个drawable是一个选择器,可以确保按下时项目被高亮显示。
注意:这个简单的代码不使用视图持有者,但我真的 建议使用一个。
答案 8 :(得分:0)
使用id代替:
即使列表很长,这是最容易处理的方法:
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;
}
然后在你的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();
.....