Android ListView选择背景

时间:2017-05-09 11:20:55

标签: android listview

好的,我对此绝对坚定。我在模式singleChoice中有一个ListView,当我点击它时我将它设置为选中。并且我将背景设置为带有选择器的drawable(我尝试了许多可以对应于所选项目的状态)。然而,当我选择它时,背景不会改变,我不知道为什么。我为此参观了几十个论坛,但无法得到答案。这是我的代码:

我的活动中的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>

2 个答案:

答案 0 :(得分:0)

  

方法I:

在列表适配器中,为position创建getter和setter方法。然后在getView方法中,比较位置,如下所示:

  @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) {

            }
        });

只需将列表选择器设置为透明..应该完成这项工作。

  

方法II:

或者可能是,你需要一个如下所示的选择器:

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

然后将列表选择器设置为@ drawable / list_selector

但是,如果这不起作用,那么我认为你可以将项目xml布局的背景设置为

android:background="@drawable/list_selector"

答案 1 :(得分: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);
    }
});

然后你就拥有了它,一个带有单选按钮的列表视图,当你点击它时会检查它们。

这是我的layout.xml中的ListView:

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