Android listview實現單選變化的效果

通常在實現listview單選效果的時候,都是使用自定義Adapter中getview()方法裏面,監聽點擊事件,而後根據不一樣的狀態顯示不一樣的效果,或者在listview中監聽點擊事件。 這一次經過實現Checkable接口來寫單選。而後在getView()中使用這個類。 首先item的xml,android

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/payment_item_check_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/header_btn_background"
    android:gravity="center_vertical"
    android:paddingBottom="10dp"
    android:paddingLeft="20dp"
    android:paddingRight="20dp"
    android:paddingTop="10dp">

    <TextView
        android:id="@+id/payment_style_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/login_btn_color"
        android:textSize="21sp" />

    <ImageView
        android:id="@+id/payment_style_img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:src="@drawable/image_indictor_right"
        android:visibility="gone" />

</RelativeLayout>
這個xml看本身的須要寫了,我這裏是單選改變字體顏色,背景顏色,勾選的圖片顯示出來。
    而後是實現Checkable接口的類
/**
 * 用於listview單選
 */
public class CheckableLayout extends RelativeLayout implements Checkable {

    private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked};

    public boolean mChecked;
    private TextView styleTv;
    private ImageView styleImg;
    private RelativeLayout payment_item_check_layout;

    public CheckableLayout(Context context) {
        super(context);
        View.inflate(context, R.layout.payment_style_item_layout, this);
        styleTv = (TextView) findViewById(R.id.payment_style_tv);
        styleImg = (ImageView) findViewById(R.id.payment_style_img);
        payment_item_check_layout = (RelativeLayout) findViewById(R.id.payment_item_check_layout);
    }

    public void setText(String text){
        styleTv.setText(text);
    }

    //設置是否選中。當咱們點擊item的時候,會調用這個方法
    @Override
    public void setChecked(boolean b) {

        if (b != mChecked){
            mChecked = b;
            refreshDrawableState();
        }
        if (mChecked) {
            payment_item_check_layout.setBackgroundColor(getResources().getColor(R.color.order_detail_bt_unpressed, getContext().getTheme()));
            styleTv.setTextColor(getResources().getColor(R.color.order_detail_btn_background_color, getContext().getTheme()));
            styleImg.setVisibility(View.VISIBLE);
        } else {
            payment_item_check_layout.setBackgroundColor(getResources().getColor(R.color.header_btn_background, getContext().getTheme()));
            styleTv.setTextColor(getResources().getColor(R.color.login_btn_color, getContext().getTheme()));
            styleImg.setVisibility(View.GONE);
        }
    }

    //判斷是否選中。
    @Override
    public boolean isChecked() {
        return mChecked;
    }

    //開關,若是當前是選中的狀態,調用該方法後取消選中,反之,選中
    @Override
    public void toggle() {

        setChecked(!mChecked);
    }


    @Override
    protected int[] onCreateDrawableState(int extraSpace) {

        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);

        if (isChecked()) mergeDrawableStates(drawableState, CHECKED_STATE_SET);

        return drawableState;
    }

    public boolean getChecked(){
        return mChecked;
    }
}
以後即是listview使用了
payment_style_listview = (ListView) view.findViewById(R.id.payment_style_listview);
            ListAdapter adapter = new ArrayAdapter<String>(context, R.layout.payment_style_item_layout, TypeNameArray){
                @NonNull
                @Override
                public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
                    CheckableLayout view;
                    if (convertView == null) {
                        view = new CheckableLayout(context);
                    } else {
                        view = (CheckableLayout) convertView;
                    }
                    view.setText(TypeNameArray[position]);
                    //在這裏返回的view便是實現了單選效果的view
                    return view;
                }
            };
            payment_style_listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    //這裏能夠知道單選的項目內容
                }
            });
            payment_style_listview.setAdapter(adapter);
            payment_style_listview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);//單選模式
            payment_style_listview.setSelected(true);//只有這一句寫了,下面一句默認單選效果纔會有效
            payment_style_listview.setItemChecked(0, true);
在上面的代碼中要注意一點,只有添加 payment_style_listview.setSelected(true),那麼payment_style_listview.setItemChecked(0, true);默認的單選才會有效果。
相關文章
相關標籤/搜索