一. 先看效果图:
二. 需要关注的点
ListView 和CheckBox联合使用出现的问题:
- checkbox抢占焦点使得listview的item条目不可点击,解决方法:
- a. 设置checkbox的focusable=false;
- b. 或者设置listview的
android:descendantFocusability="blocksDescendants"
由于listvie的item条目复用的问题, 使得checkbox的一次点击多处条目处于checked或者unchecked的状态,解决方法:
- a 将数据list中的对象,定义一个boolean类型的isChecked变量来控制
- b 使用一个list将被点击的postion位置记录下来, 具体代码如下:
// 点击checked时判断,如果checked就添加, 没有就删除 holder.check.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (holder.check.isChecked()) { selectId.add(position); Log.d("tag","添加"+position); }else{ //需要强制转化使用移除对象的方法 selectId.remove((Integer)position); } // 设置checkbox的初始状态,默认都为false, 如果list中有就设置true holder.check.setChecked(false); if (selectId.contains(position)){ holder.check.setChecked(true); }
三. 具体xml布局文件
主界面布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ListView
android:padding="20dp"
android:scrollbars="none"
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="0dp"/>
<RelativeLayout
android:visibility="gone"
android:id="@+id/rll_view"
android:background="#22000000"
android:layout_width="match_parent"
android:layout_height="60dp">
<ImageView
android:id="@+id/btn_delete"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_centerInParent="true"
android:scaleType="centerInside"
android:src="@drawable/delete_selector"/>
</RelativeLayout>
</LinearLayout>
listview的item布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_margin="20dp"
android:orientation="horizontal">
<TextView
android:gravity="center_vertical"
android:id="@+id/txtName"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:text=""
android:textColor="#333"
android:textSize="17sp"/>
<CheckBox
android:layout_gravity="center_vertical"
android:background="@null"
android:button="@drawable/checkbox_bj"
android:scaleX="0.6"
android:scaleY="0.6"
android:id="@+id/check"
android:layout_width="60dp"
android:layout_height="60dp"
android:clickable="false"
android:visibility="gone"
/>
</LinearLayout>
四. 逻辑代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private ListView listview;
private List<String> mContent = new ArrayList<>();
private List<Integer> selectId = new ArrayList<>();
private boolean isDeleteMode = false; //是否多选
private Adapter adapter;
private RelativeLayout layout;
private ImageView delete;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initDatas();
initEvent();
}
private void initView() {
listview = (ListView) findViewById(R.id.list_view);
layout = (RelativeLayout) findViewById(R.id.rll_view);
delete = (ImageView) findViewById(R.id.btn_delete);
adapter = new Adapter();
}
private void initDatas() {
for (int i = 0; i < 20; i++) {
mContent.add("美国打棒子犹如婊子偷汉子" + i);
}
}
private void initEvent() {
listview.setAdapter(adapter);
delete.setOnClickListener(this);
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, "被点击了", Toast.LENGTH_SHORT).show();
}
});
listview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
isDeleteMode = true;
selectId.clear();
layout.setVisibility(View.VISIBLE);
return true;
}
});
}
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.btn_delete:
isDeleteMode = false;
Integer[] select = selectId.toArray(new Integer[selectId.size()]);
Arrays.sort(select);
for (int i = 0; i < select.length; i++) {
Log.d("tag",select[i]+"****************");
}
for (int i = select.length-1; i>=0 ; i--) {
mContent.remove((int)select[i]);
Log.d("tag","移除了"+select[i]);
}
selectId.clear();
adapter.notifyDataSetChanged();
layout.setVisibility(View.GONE);
break;
default:
break;
}
}
class Adapter extends BaseAdapter {
private Context context;
private LayoutInflater inflater = null;
public int getCount() {
return mContent.size();
}
public Object getItem(int position) {
return mContent.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = View.inflate(MainActivity.this, R.layout.item_list_view, null);
holder = new ViewHolder();
holder.content = (TextView) convertView.findViewById(R.id.txtName);
holder.check = (CheckBox) convertView.findViewById(R.id.check);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
final String content = mContent.get(position);
holder.content.setText(content);
holder.check.setChecked(false);
if (selectId.contains(position)){
holder.check.setChecked(true);
}
if (isDeleteMode) {
holder.check.setVisibility(View.VISIBLE);
} else {
holder.check.setVisibility(View.INVISIBLE);
}
holder.check.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (holder.check.isChecked()) {
selectId.add(position);
Log.d("tag","添加"+position);
}else{
//需要强制转化使用移除对象的方法
selectId.remove((Integer)position);
}
Log.d("tag",position+"被选中");
}
});
return convertView;
}
class ViewHolder {
TextView content;
CheckBox check;
}
}
}