通常在實現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);默認的單選才會有效果。