前言
上次寫了ListView+CheckBox實現全選效果,而沒有實現單選效果,這次添上.這篇沒有講解,因爲在上一篇中講解很詳細,不懂得可以去參考下.老規矩,還是先上圖.
點擊確定按鈕後打印的值:
頁面佈局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/head_layout"></include>
<ListView
android:id="@+id/lv_check"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</ListView>
<Button
android:id="@+id/bt_confirm"
android:textColor="@color/white"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="確定"
android:textSize="18sp"
android:background="@color/colorPrimary"/>
</LinearLayout>
Activity類
package com.listenergao.mytest.activity;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ListView;
import com.listenergao.mytest.R;
import com.listenergao.mytest.data.TestCheckOneAdapter;
import com.listenergao.mytest.requestBean.TestCheckBean;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
/**
* Created by ListenerGao on 2016/9/12.
* <p/>
* ListView實現單選
*/
public class TestCheckOne extends BaseActivity implements AdapterView.OnItemClickListener {
private static final String TAG = "TestCheckOne";
@BindView(R.id.ib_arrow_left)
ImageButton ibArrowLeft;
@BindView(R.id.bt_confirm)
Button btConfirm;
@BindView(R.id.lv_check)
ListView lvCheck;
private List<TestCheckBean> mData;
private TestCheckOneAdapter mAdapter;
@Override
protected int getLayoutResId() {
return R.layout.activity_test_checkone;
}
@Override
protected void initView() {
ButterKnife.bind(this);
ibArrowLeft.setVisibility(View.VISIBLE);
}
@Override
protected void initData() {
//初始化數據
mData = new ArrayList<>();
for (int i = 0; i < 150; i++) {
TestCheckBean testCheckBean = new TestCheckBean(i, "張三" + i);
mData.add(testCheckBean);
}
mAdapter = new TestCheckOneAdapter(this, mData);
lvCheck.setAdapter(mAdapter);
lvCheck.setOnItemClickListener(this);
}
@OnClick({R.id.ib_arrow_left, R.id.bt_confirm})
public void onClick(View view) {
switch (view.getId()) {
case R.id.ib_arrow_left:
finish();
break;
case R.id.bt_confirm:
//根據得到的位置,獲取選中item的數據Bean
int selectPosition = mAdapter.getSelectPosition();
TestCheckBean checkBean = mData.get(selectPosition);
Log.d(TAG, checkBean.toString());
break;
}
}
//設置ListView的點擊事件,實現CheckBox聯動效果.
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
TestCheckOneAdapter.ViewHolder holder = (TestCheckOneAdapter.ViewHolder) view.getTag();
holder.checkBox.toggle();
}
}
Adapter類
package com.listenergao.mytest.data;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
import com.listenergao.mytest.R;
import com.listenergao.mytest.requestBean.TestCheckBean;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
/**
* Created by ListenerGao on 2016/9/12.
*/
public class TestCheckOneAdapter extends BaseAdapter {
private static final String TAG = "TestCheckOneAdapter";
private Activity mActivity;
private List<TestCheckBean> mData;
private int tempPosition = -1; //記錄已經點擊的CheckBox的位置
public TestCheckOneAdapter(Activity context, List<TestCheckBean> data) {
this.mActivity = context;
this.mData = data;
}
@Override
public int getCount() {
return mData.size() > 0 ? mData.size() : 0;
}
@Override
public Object getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(mActivity).inflate(R.layout.item_test_checkall, null);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tvName.setText(mData.get(position).getName());
holder.checkBox.setId(position); //設置當前position爲CheckBox的id
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
if (tempPosition != -1) {
//根據id找到上次點擊的CheckBox,將它設置爲false.
CheckBox tempCheckBox = (CheckBox) mActivity.findViewById(tempPosition);
if (tempCheckBox != null) {
tempCheckBox.setChecked(false);
}
}
//保存當前選中CheckBox的id值
tempPosition = buttonView.getId();
} else { //當CheckBox被選中,又被取消時,將tempPosition重新初始化.
tempPosition = -1;
}
}
});
if (position == tempPosition) //比較位置是否一樣,一樣就設置爲選中,否則就設置爲未選中.
holder.checkBox.setChecked(true);
else holder.checkBox.setChecked(false);
return convertView;
}
//返回當前CheckBox選中的位置,便於獲取值.
public int getSelectPosition() {
return tempPosition;
}
public static class ViewHolder {
@BindView(R.id.tv_name)
public TextView tvName;
@BindView(R.id.cb_check)
public CheckBox checkBox;
public ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
}