Android ListViewselect的项目保持突出显示
我有一个带有两个ListView
的XML
,其中一个带有由select查询( lv_cli
)填充的客户端列表,另一个带有选定客户端( lv_cli_det
)的详细信息。 我想保持在lv_cli
select客户端,而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(); } });
按住ListView项目的颜色时,在列表视图项目布局中包含以下行:
android:background="@drawable/bg_key"
然后像这样在drawable
文件夹中定义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>
最后,在你的ListView
onClickListener
包含这个:
listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position,long arg3) { view.setSelected(true); ... // Anything } });
这样,任何时候只有一个项目将被select颜色。 你可以在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>
find正确的方法。 这很简单。 在资源描述如下:
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类的抽象祖先)
onItemClick和改变视图背景的PS操作是破产的,因为视图本身是一个临时对象。 因此你不能跟踪一个视图。
如果我们的列表足够长,那么与滚出项目相关的视图将从层次结构中删除,并且当这些项目再次显示(具有caching的显示选项,如背景)时将被重新创build。 因此,我们所追踪的视图现在不是该项目的实际视图,而更改其背景对实际项目视图没有任何影响。 结果我们select了多个项目。
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将当前选定元素保存在全局variables中。
简单的方法是,如果您在xml中使用listview,请在您的列表视图中使用此属性,
android:choiceMode="singleChoice" android:listSelector="#your color code"
如果不使用xml,通过编程
listview.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE); listview.setSelector(android.R.color.holo_blue_light);
你需要这样的select器:
<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。
从Avinash Kumar Pankaj的例子
View v;
然后在创build方法
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; }
它为我工作。 谢谢。
我replace了
v = new View(getActivity());
至
v = new View(this);
代码运行良好。
前面的例子中,xml文件的'colors'和'bg_key'也是必须的,以及ListView属性android:background =“@ drawable / bg_key”
毛罗
*请确保列表视图容器的根目录没有纹波
将此行添加到您的列表视图
android:listSelector="@drawable/background_listview"
这里是“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>
background_listview.xml文件中使用的颜色:
<color name="primary_color">#cc7e00</color> <color name="white_background">#ffffffff</color>
之后
(点击项目包含橙色,直到你点击另一个项目)
你可以做的一个方法是跟踪你的活动中当前select的位置:
@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颜色设置为布局作为背景,等于您当前选定的位置。 注意如何在未select项目时设置可绘制的背景资源。 这可能是你的情况不同(因为你没有发布代码)。 在我的情况下,这个drawable是一个select器,确保按下时该项目是高亮的。
注:这个简单的代码不使用查看持有人,但我真的推荐使用一个。
改用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(); .....