2012-09-14 64 views
0

我有這個Selector作爲listSelectorListView。此外,在ListView中,我已經設置了如何設置ListView選擇顏色直到下一次選擇?

android:choiceMode="singleChoice" 
android:listSelector="@drawable/list_selector" 
android:background="@android:color/transparent" 
android:cacheColorHint="@android:color/transparent" 

它被正確服用藍色,當用戶觸摸的ListView任何項目,但只要用戶刪除的手指,它變成回黑色。我希望選中的項目保持藍色,直到用戶觸摸任何其他項目。

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

我需要做什麼改變?

回答

0

onListItemClick,迫使視圖狀態:

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
     v.setSelected(true); 
} 
+0

我做到了,但沒有變化。 –

+0

嘗試添加一個項目只有android:state_selected =「true」 – Blackbelt

1

您必須設置ListViewsingleChoiceandroid:choiceMode。此外,您應該將android:listSelector設置爲您已經實現的選擇器,並從ListView的項目中移除該選擇器(或其他android:background可繪製),以便其背景透明。

此外,你應該伸出你的選擇做出反應android:state_checked並註冊OnItemClickListener這樣的:

listView.setOnItemClickListener(new OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     listView.setItemChecked(position, true); 
    } 

}); 

您使用列表項的頂層視圖組件需要實現接口Checkable。請參閱http://developer.android.com/reference/android/widget/Checkable.html瞭解已開箱即用的類別列表。如果你只想顯示文字CheckedTextView應該爲你做。否則,如果使用自定義視圖,則必須自己實現此接口。

+0

我爲ListView的項目設置無背景。在ListView中,我設置了android:choiceMode =「singleChoice」,android:listSelector =「@ drawable/list_selector」,android:background =「@ android:color/transparent」和 android:cacheColorHint =「@ android:color /透明」 。它仍然表現出相同的效果。在這裏我想提一下,我已經在包含Listview的LinearLayout中提供了一個背景圖像。問題是什麼? –

+0

我擴展了我的解釋。看看第二部分。 –

+0

我不想顯示任何複選框,只需突出顯示listview項目。這不可能嗎? –

0

在你的代碼

StateListDrawable states = new StateListDrawable(); 
    states.addState(new int[] {android.R.attr.state_pressed}, 
     getResources().getDrawable(R.drawable.pressed)); 
    states.addState(new int[] {android.R.attr.state_focused}, 
     getResources().getDrawable(R.drawable.focused)); 
    states.addState(new int[] { }, 
     getResources().getDrawable(R.drawable.normal)); 
    imageView.setImageDrawable(states); 

它可以幫助你....

0

嘗試這種在這種情況下,我認爲你需要從ArrayAdapter類管理。 你必須記住上次點擊的項目視圖和位置。

基本思路是onListItemClick通過點擊位置和ItemView控件到適配器有 我們將設置它的背景,你喜歡的顏色,改變了最後選定以查看 背景色爲默認顏色。

public class SampleAdapter extends ArrayAdapter<Object> { 

    private int mSelection = 0; 

    public SampleAdapter(Context context, int resource, int textViewResourceId, 
      List<Object> objects) { 
     super(context, resource, textViewResourceId, objects); 
    } 

    public void setSelection(int mSelection, View selectedItemView) { 
     this.mSelection = mSelection; 

     if (selectedItemView!= null && lastSelectedRow != null 
       && selectedItemView!= lastSelectedRow) { 
      lastSelectedRow 
        .setBackgroundResource(R.drawable.bg_normal); 
      selectedItemView 
        .setBackgroundResource(R.drawable.bg_selected); 
     } 

     this.lastSelectedRow = selectedItemView; 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     //Usual code logic here.... 

     if (mSelection == position) { 
      mViewHolder.mRootView 
        .setBackgroundResource(R.drawable.bg_selected); 
      lastSelectedRow = mViewHolder.mRootView; 
     } else { 
      mViewHolder.mRootView 
        .setBackgroundResource(R.drawable.bg_normal); 
     } 


     return view; 
    } 

    private static class ViewHolder { 
     TextView name; 
     View mRootView; 
    } 
} 

在列表項目單擊您需要將點擊的項目和位置傳遞給適配器。

public void onItemClick(AdapterView<?> arg0, View listItemView, 
     int position, long id) { 

    if(myAdapter != null) 
    { 
     myAdapter.setSelection(position,listItemView); 
    } 
} 

,如果你想稱這組選擇其他點 你可以這樣調用。

myAdapter.setSelection(position,mListViwe.getChildAt(pos)); 
mListViwe.setSelectionFromTop(position, 0);