Android ListViewselect的项目保持突出显示

我有一个带有两个ListViewXML ,其中一个带有由select查询( lv_cli )填充的客户端列表,另一个带有选定客户端( lv_cli_det )的详细信息。 我想保持在lv_cliselect客户端,而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(); .....