zoukankan      html  css  js  c++  java
  • 实现自定义checkbox listview的方法

    1。方法一:利用adapter这种方法的原理

    破坏view的重用,使用List保存checkchange状态,然后在bindview中添加根据list的状态修改checkbox的勾。

    注意mCheckItemView.mCheckBox.setOnCheckedChangeListener(null);修改前屏蔽事件

    package com.handcent.im.adapter;

    import java.util.ArrayList;
    import java.util.List;

    import android.content.Context;
    import android.database.Cursor;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.CheckBox;
    import android.widget.CompoundButton;
    import android.widget.CompoundButton.OnCheckedChangeListener;
    import android.widget.CursorAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;

    import com.handcent.im.ui.R;

    public class CheckedCursorAdapter extends CursorAdapter {
    private List<Integer> mCheckedList;

    public CheckedCursorAdapter(Context context, Cursor c) {
    super(context, c);

    mCheckedList = new ArrayList<Integer>();
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
    System.out.println("bind");
    CheckItemView mCheckItemView = new CheckItemView();
    mCheckItemView.mHeadView = (ImageView) view.findViewById(R.id.ci_img_head);
    mCheckItemView.mNickName = (TextView) view.findViewById(R.id.ci_txt_name);
    mCheckItemView.mSignature = (TextView) view.findViewById(R.id.ci_txt_signure);
    mCheckItemView.mCheckBox = (CheckBox) view.findViewById(R.id.ci_chk_choose);
    // mCheckItemView.mCheckBox.setTag(cursor.getInt(0));
    for (int i : mCheckedList) {
    System.out.println("checkLIst:" + i);
    }
    mCheckItemView.mCheckBox.setOnCheckedChangeListener(null);
    if (mCheckedList.contains(cursor.getInt(0))) {
    mCheckItemView.mCheckBox.setChecked(true);
    } else {
    mCheckItemView.mCheckBox.setChecked(false);
    }
    mCheckItemView.mCheckBox.setTag(cursor.getInt(0));
    mCheckItemView.mCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

    @Override
    public void onCheckedChanged(CompoundButton buttonView,
    boolean isChecked) {
    // checkbox更改状态
    Integer index = (Integer) buttonView.getTag();
    if (isChecked) {
    if (!mCheckedList.contains(index))
    mCheckedList.add(index);
    } else {
    mCheckedList.remove(index);
    }

    }
    });

    mCheckItemView.mNickName.setText(cursor.getString(1));
    mCheckItemView.mSignature.setText(cursor.getString(2));
    // int tag = (Integer) mCheckItemView.mCheckBox.getTag();

    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
    LayoutInflater mInflater = LayoutInflater.from(context);
    View mView = mInflater.inflate(R.layout.contactitem, null);

    return mView;
    }

    private class CheckItemView {
    private ImageView mHeadView;
    private TextView mNickName;
    private TextView mSignature;
    private CheckBox mCheckBox;
    }

    }

    2。方法二:使用CheckedTextView

    原理:自定义一个继承Checkable的Linearlayout或者RelativeLayout,在其中放置一个CheckedTextView不使用TextView的值而达到效果

    package com.handcent.im.ui.view;

    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.View;
    import android.widget.Checkable;
    import android.widget.CheckedTextView;
    import android.widget.RelativeLayout;

    /**
    * custom view extends {@link RelativeLayout} and implements {@link Checkable}
    * to response the action CheckBox
    *
    * @author Pandans
    *
    */
    public class ChkRelativeLayout extends RelativeLayout implements Checkable {

    private CheckedTextView _checkbox;

    public ChkRelativeLayout(Context context) {
    super(context);
    }

    public ChkRelativeLayout(Context context, AttributeSet set) {
    super(context, set);
    }

    @Override
    public boolean isChecked() {
    return _checkbox != null ? _checkbox.isChecked() : false;
    }

    @Override
    protected void onFinishInflate() {
    super.onFinishInflate();
    // find checked text view
    int childCount = getChildCount();
    for (int i = 0; i < childCount; ++i) {
    View v = getChildAt(i);
    if (v instanceof CheckedTextView) {
    _checkbox = (CheckedTextView) v;
    }
    }
    }

    /**
    * <p>
    * Changes the checked state of this LinearLayout
    * </p>
    *
    * @param checed
    * true to check the LinearLayout ,false to uncheck it
    */
    @Override
    public void setChecked(boolean checked) {
    if (_checkbox != null) {
    _checkbox.setChecked(checked);
    }

    }

    @Override
    public void toggle() {
    if (_checkbox != null) {
    _checkbox.toggle();
    }
    }

    }

  • 相关阅读:
    PAT甲级——1095 Cars on Campus (排序、映射、字符串操作、题意理解)
    PAT甲级——1096 Consecutive Factors (数学题)
    PAT甲级——1097 Deduplication on a Linked List (链表)
    博客作业06--图
    博客作业05--查找
    博客作业04--树
    博客作业03--栈和队列
    博客作业2---线性表
    博客作业01-抽象数据类型
    C语言最后一次作业--总结报告
  • 原文地址:https://www.cnblogs.com/pandans/p/2244819.html
Copyright © 2011-2022 走看看