2017-05-09 67 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"