9

我已經發布了相同的問題幾次,但它尚未解決。我有一個ListFragment,我想突出顯示列表中的選定項目。我已經給出了使用「選擇器」的建議。我不明白如何使用這個選擇器。我ListFragment類是:突出顯示「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中使用選擇器,但在我的情況下,如果我沒有爲Listview定義任何xml,那麼我將如何使用「選擇器」?我正在使用預定義的android.R.layout.simple_list_item_1

+1

Android中用於ListView的「選擇」概念適用於D-pad,軌跡球,箭頭鍵和其他指針設備。在平板電腦上,有一個「激活」行的相關概念,用於突出顯示觸摸屏上最後一次點擊的項目,爲相鄰項目提供上下文(例如主細節模式)。 – CommonsWare

回答

4

我沒有得到我想要的東西,所以我一直在挖,並提出了一個「便宜」的解決方案,這可能不是最好的做法,但做這項工作。 我希望項目在選中時突出顯示,當從listFragment中選擇其他項目時顏色應該消失。 這是什麼工作了我 - 我定義的靜態View V; 並初始化它V = new View(getActivity()); 內。然後我

onListItemClick(ListView的L,視圖V,INT位置,長ID)

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

甚至可能稱之爲不好的做法,而不是「不是最佳做法」;將保存對活動的引用的視圖存儲在靜態對象中。從而泄露活動。 – NickL

+3

當列表變得比屏幕更大時,您將遇到問題。因爲相同的視圖將被重新用於先前隱藏的項目,當它們被顯示時,因此其中一些可以被顯示爲「被選擇」。 – Stefan

+0

@Stefan我有這個問題。你知道如何解決這個問題嗎? http://stackoverflow.com/questions/31442067/list-item-wont-stay-selected-despite-setting-necessary-properties – MacaronLover

6

從您的ListView,請致電setChoiceMode(ListView.CHOICE_MODE_SINGLE)。然後,無論何時要突出顯示選定的項目,請致電setItemChecked(index, true)

+4

如果您將自定義適配器與自定義列表項目佈局配合使用,則這不起作用。 – Mehmed

4

我試過一樣,我沒有找到任何好的解決方案。 我其實做的就是使用此代碼來設置監聽器:

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; 
} 

也就是說,我更改列表項的背景編程。 而且在點擊列表元素時避免閃爍效果我不爲按下狀態

<?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> 

這可以作爲供我定義任何選擇。我沒有找到更好的解決方案,因爲setSelected(true)對列表項無效!

+0

它看起來很好,會試試這個,讓你知道我發現了什麼。 –

7

的以下爲我工作:

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 /佈局/ 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 before並將以下代碼添加到onlistitemclick函數中。(在ListFragment: highlight selected row提到)

我的代碼

getListView().setItemChecked(0, true); 

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; 
    } 

}  
+0

這聽起來像它會遭受同樣的問題Stefan在接受的答案中提到:你會有當列表增長大於屏幕時出現問題。因爲相同的視圖將被重新用於先前隱藏的項目,當它們被顯示時,因此其中一些可以被顯示爲「被選擇」。 –

0

setListAdapter(oAdapter); 

代碼塊

0

相似類型a1pha的東西,但與選擇,一旦你有查看你可以view.setSelected(true),那會添加你在y上定義的樣式我們的選擇。 您需要在執行操作後移除標誌。

3

這對ListFragment我工作得非常好,但我認爲它只適用於Android 4.0及更高版本。我創建的列表項的簡單佈局android:background="?android:attr/activatedBackgroundIndicator(在安卓4.0以下的情況下,你需要ceate中可繪製類似的一個):

<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" /> 

,然後使用這個剛剛創建一個簡單的ArrayAdapter佈局和設置選擇模式單一:

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方法hightlight必要的項目:

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

如果您不重寫'onListItemClick',那麼'ListFragment'會自動將該項目設置爲選中狀態。或者只是確保調用'super.onListItemClick(...)'。 – Gautam

相關問題