突出显示“ListFragment”中的选定项目?

我已经发布了相同的问题几次,但它还没有得到解决。 我有一个ListFragment ,我想突出显示列表中选定的项目。 我已经给出了使用“select器”的build议。 我不明白如何使用这个select器。 我的ListFragment类是:

 // Create an adapter with list of stores and populate the list with // values ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, StoreList); setListAdapter(adapter); mDbHelper.close(); } /* * (non-Javadoc) * * Handles the event when an item is clicked on left pane, performs action * based on the selection in left pane * * @see android.app.ListFragment#onListItemClick(android.widget.ListView, * android.view.View, int, long) */ @Override public void onListItemClick(ListView l, View v, int position, long id) { String selectedStore = (String) getListAdapter().getItem(position); DetailFragment fragment = (DetailFragment) getFragmentManager() .findFragmentById(R.id.detailFragment); if (fragment != null && fragment.isInLayout()) { v.setBackgroundColor(getResources().getColor(R.color.BLUE)); // passes selectedStore to detail fragment fragment.setText(selectedStore); // getItemList(selectedStore); } 

使用setBackground永久设置颜色,但是我希望当另一个项目被选中时,它会消失。 我知道如何在ListView使用select器,但在我的情况下,如果我没有为Listview定义任何xml,那么我将如何使用“select器”? 我正在使用预定义的android.R.layout.simple_list_item_1

以下为我工作:

RES /颜色/ menu_highlight.xml

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@color/red" /> <item android:state_selected="true" android:drawable="@color/red" /> <item android:drawable="@color/white" /> </selector> 

RES /值/ colors.xml:

 <?xml version="1.0" encoding="utf-8"?> <resources> <color name="white">#FFFFFF</color> <color name="red">#FF0000</color> </resources> 

res / layout / menuitem.xml : :(列表中每个项目的XML)

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="wrap_content" android:layout_width="fill_parent"> <TextView android:id="@+id/textmenu" android:layout_height="wrap_content" android:text="text" android:textColor="#FFFFFF" android:background="@color/menu_highlight" android:visibility="visible" android:layout_width="fill_parent" /> </LinearLayout> 

最后,在ListFragment类中,添加View previous并将以下代码添加到onlistitemclick函数中(在ListFragment中提到:突出显示所选行 )

 public class MenuListFragment extends ListFragment{ View previous; @Override public void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); //Logic to highlight selected item previous.setSelected(false); v.setSelected(true); previous=v; } } 

ListView中调用setChoiceMode(ListView.CHOICE_MODE_SINGLE) 。 然后,每当你想突出显示一个选定的项目,调用setItemChecked(index, true)

我尝试了相同的,我没有find任何好的解决scheme。 我实际上做的是使用这段代码来设置监听器:

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){ public void onItemClick(AdapterView<?> parent, View view, int position, long id){ list_adapter.setSelectedPosition(position); listView.invalidate(); } }); 

列表适配器定义了以下公用方法

 @Override public View getView(int position, View convertView, ViewGroup parent) { View rowView = GuiBuilder.createHeroListItemView(heroes.get(position),getContext(),parent,false); if(position == selected_pos){ rowView.setBackgroundColor((rowView.getResources().getColor(R.color.list_item_selected_color))); } return rowView; } public void setSelectedPosition(int selected_pos){ this.selected_pos = selected_pos; } public int getSelectedPosition(){ return selected_pos; } 

也就是说,我以编程方式更改列表项目的背景。 此外,为了避免单击列表元素时的闪烁效果,我没有为按下状态定义任何select器

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_focused="true" android:drawable="@drawable/list_item_focused_color" /> <item android:drawable="@drawable/list_item_default_color" /> </selector> 

这工作正如我打算。 我没有find更好的解决scheme,因为setSelected(true)在列表项上不起作用!

我没有得到我想要的东西,所以我一直在挖,并提出了一个“便宜”的解决scheme,这可能不是最好的做法,但做这项工作。 我希望项目在选中时突出显示,当从listFragment中select其他项目时颜色应该消失。 这是对我来说,我定义了一个静态View V; 并初始化它V = new View(getActivity()); 然后在我的里面

onListItemClick(ListView l, View v ,int position,long id)

  V.setBackgroundResource(0); v.setBackgroundResource(R.color.BLUE); V = v; 

这在ListFragment对我来说非常好,但我认为它只适用于Android 4.0及更高版本。 我使用android:background="?android:attr/activatedBackgroundIndicator创build了一个简单的布局(在Android 4.0以下的情况下,您需要在drawables中使用类似的布局):

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="?android:attr/listPreferredItemHeight" android:gravity="center_vertical" android:background="?android:attr/activatedBackgroundIndicator" android:orientation="horizontal" > <TextView android:id="@+id/list_item_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ellipsize="end" android:singleLine="true" android:textAppearance="?android:attr/textAppearanceListItemSmall" android:gravity="center_vertical" android:layout_margin="@dimen/double_view_margin" /> 

然后,只需使用此布局创build一个简单的ArrayAdapter并将select模式设置为单个:

 final ArrayAdapter<String> labelsAdapter = new ArrayAdapter<String>(getActivity(), R.layout.item_simple_list_item, R.id.list_item_text, labels); setListAdapter(labelsAdapter); getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

之后,您可以使用setItemChecked方法setItemChecked必要的项目:

 @Override public void onListItemClick(final ListView l, final View v, final int position, final long id) { getListView().setItemChecked(position, true); } 

我的代码

 getListView().setItemChecked(0, true); 

 setListAdapter(oAdapter); 

代码块

类似于a1pha类似的东西,但有了select器,一旦你有了视图,你可以通过view.setSelected(true)来添加你在select器上定义的样式。 一旦执行操作,您需要删除标志。