2017-05-09 71 views
0

好吧,我絕對堅持這一點。我有一個ListView模式singleChoice,當我點擊它,我將它設置爲選中。我用選擇器將背景設置爲drawable(我嘗試了許多可以對應於選定項目的狀態)。但是,當我選擇它的背景不會改變,我不明白爲什麼。我爲此訪問了數十個論壇,但無法得到答案。這裏是我的代碼:Android ListView選擇背景

在我的活動ListView控件:

<com.gaetanl.aspa.ui.component.ExtensibleListView 
    android:id="@+id/payment_billing_address_list" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@drawable/item_selectable" 
    android:choiceMode="singleChoice"></com.gaetanl.aspa.ui.component.ExtensibleListView> 

其類:

public class ExtensibleListView extends ListView { 
    public ExtensibleListView(Context context) { 
     this(context, null); 
    } 

    public ExtensibleListView(Context context, AttributeSet attrs) { 
     this(context, attrs, android.R.attr.listViewStyle); 
    } 

    public ExtensibleListView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       Log.d(this, "item " + position + " selected = " + view.isSelected()); 
       view.setSelected(true); 
       Log.d(this, "selected = " + view.isSelected()); 
      } 
     }); 
    } 

    @Override 
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); 
     super.onMeasure(widthMeasureSpec, expandSpec); 
    } 
} 

的選擇:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:state_activated="true" 
     android:drawable="@color/colorPrimary" /> 
    <item 
     android:state_active="true" 
     android:drawable="@color/colorPrimary" /> 
    <item 
     android:state_checked="true" 
     android:drawable="@color/colorPrimary" /> 
    <item 
     android:state_selected="true" 
     android:drawable="@color/colorPrimary" /> 
    <item 
     android:drawable="@android:color/transparent" /> 
</selector> 
+0

我不太清楚你想達到什麼..你想改變一個已經選擇列表視圖項的背景顏色? –

+0

是的就是這樣! –

+0

請發佈您的適配器類的列表視圖請,我可能會然後你。 –

回答

0

好的,我找到了答案。我愚蠢地試圖設置ListView背景(見上面的代碼)。我需要做的是在創建適配器時,爲包含所選項目變體的項目選擇視圖。 Android默認有一個:simple_list_item_single_choice。

因此,這裏的工作代碼:

myListView = ((ListView) findViewById(R.id.listview_id)); 
ArrayAdapter<String> myAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_single_choice, myList); 
myListView.setAdapter(myAdapter); 
myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     view.setSelected(true); 
    } 
}); 

然後你擁有它,與該檢查自己,當你點擊EM右側單選按鈕列表視圖。

下面是我的layout.xml ListView控件:

<ListView 
    android:id="@+id/listview_id" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:choiceMode="singleChoice"> 
</ListView> 
0

方法一:

在您的列表適配器,創建getView方法position.Then getter和setter方法,比較的位置如下:然後

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


     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.list_item.xml, null); 
      holder = new ViewHolder();  holder.itemLayout(LinearLyout)convertView.findViewById(R.id.item_layout); 
      convertView.setTag(holder); 

     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     if(position==getPosition()){ 
      holder.itemLayout.setBackgroundColor(ContextCompat.getColor(context,R.color.back_ground_color)); 
     }else{ 
      holder.itemLayout.setBackgroundColor(ContextCompat.getColor(context,R.color.background_unselect)); 
     } 
     return convertView; 
    } 
public void setPosition(int posit) { 
     this.position = posit; 
    } 

    private int getPosition() { 
     return this.position; 
    } 

活動中,ListView的onItemSelected內()方法:調用適配器的setPositionMethod:

list_view.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { 
       mAdapter.setPosition(i); 
       mAdapter.notifyDataSetChanged(); 

      } 

      @Override 
      public void onNothingSelected(AdapterView<?> adapterView) { 

      } 
     }); 

只需將列表選擇器設置爲透明..應該做的工作。

方法二:

或可能是,你需要選擇如下圖所示:

<?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/color_primary" > 
    </item> 
    <item 
     android:state_focused="true" 
     android:drawable="@color/color_primary" > 
    </item> 
    <item 
     android:state_selected="true" 
     android:drawablecolor="@color/color_primary" > 
    </item> 
    <item android:color="@color/@color/transparent" > 
    </item> 

</selector> 

然後把列表選擇爲@繪製/ list_selector

但是,如果不起作用,那麼我認爲你可以設置項目xml佈局的背景爲

android:background="@drawable/list_selector"