android - 复选框的位置得到改变

标签 android checkbox filter

我正在尝试在扩展 BaseAdapter 的自定义适配器上应用过滤器,在其中我遇到了一些问题,在我根据 EditText 中的文本过滤输入并检查 CheckBox 以选择一个值之后,如果我删除了文本EditText 以搜索其他内容,选中复选框的位置发生变化。

主 Activity

public class MainActivity extends Activity implements OnItemClickListener {

    EditText searchText;

    ArrayList<String> phno0 = new ArrayList<String>();
    List<String> arrayListNames;
    // private ListView listview;
    // private EditText edittext;
    public List<ProfileBean> list;
    public SearchableAdapter adapter;
    ProfileBean bean;

    String[] cellArray = null;
    String contacts;
    ListView lv;
    String phoneNumber, name;

    // StringBuilder b = new StringBuilder();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ActionBar actionBar = getActionBar();

        actionBar.setDisplayHomeAsUpEnabled(true);
        ColorDrawable colorDrawable = new ColorDrawable(
                Color.parseColor("#00aef0"));

        actionBar.setBackgroundDrawable(colorDrawable);
        setContentView(R.layout.get);
        // mStatusView = (TextView) findViewById(R.id.text1);
        searchText = (AutoCompleteTextView) findViewById(R.id.autocomplete);
        lv = (ListView) findViewById(R.id.listview);
        list = new ArrayList<ProfileBean>();

        getAllCallLogs(this.getContentResolver());

        adapter = new SearchableAdapter(getApplicationContext(), list);
        lv.setAdapter(adapter);
        lv.setItemsCanFocus(false);
        lv.setOnItemClickListener(this);
        lv.setTextFilterEnabled(true);

        contacts = SmsSend.contacts;

        if (SmsSend.contacts != null) {
            cellArray = contacts.split(";");
            //contacts=null;
            // Toast.makeText(getApplication(), contacts.toString(),
            // Toast.LENGTH_LONG).show();
            for (int i = 0; i < cellArray.length; i++) {

                for (int j = 0; j < list.size(); j++) {

                    if (cellArray[i].equals(list.get(j).getNumber())) {
                        adapter.setChecked(j, true);

                        // break;
                    }
                }

            }
        }



    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // TODO Auto-generated method stub
        getMenuInflater().inflate(R.menu.contact_main, menu);
        MenuItem searchItem = menu.findItem(R.id.action_search);

        return true;

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // TODO Auto-generated method stub

        switch (item.getItemId()) {

        case android.R.id.home:
            //StringBuilder checkedcontacts = new StringBuilder();
            // System.out.println(".............." +
            // adapter.mCheckStates.size());
            for (int i = 0; i < list.size(); i++)

            {
                if (adapter.mCheckStates.get(i) == true) {
                    phno0.add(list.get(i).getNumber());
                    //checkedcontacts.append(list.get(i).toString());
                //  checkedcontacts.append("\n");
                    // Toast.makeText(getApplicationContext(),
                    // list.get(i).getNumber().toString(),
                    // Toast.LENGTH_LONG).show();
                } else {
                    System.out.println("..Not Checked......"
                            + list.get(i).getNumber().toString());
                }

            }

            Intent returnIntent = new Intent();
            returnIntent.putStringArrayListExtra("name", phno0);
            setResult(RESULT_OK, returnIntent);

            finish();
            break;

        case R.id.addPage:

            break;
        case R.id.action_search:

            searchText.setVisibility(View.VISIBLE);
            searchText.addTextChangedListener(new TextWatcher() {
                @Override
                public void afterTextChanged(Editable arg0) {

                }

                @Override
                public void beforeTextChanged(CharSequence s, int start, int count,
                        int after) {

                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before,
                        int count) {
                    adapter.getFilter().filter(s.toString());
                }
            });
            break;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onBackPressed() {
        // TODO Auto-generated method stub
phno0.clear();
        //StringBuilder checkedcontacts = new StringBuilder();
        // System.out.println(".............." + adapter.mCheckStates.size());
        for (int i = 0; i < list.size(); i++)

        {
            if (adapter.mCheckStates.get(i) == true) {
                phno0.add(list.get(i).getNumber());

            } else {
                System.out.println("..Not Checked......"
                        + list.get(i).getNumber().toString());
            }

        }

        Intent returnIntent = new Intent();
        returnIntent.putStringArrayListExtra("name", phno0);
        setResult(RESULT_OK, returnIntent);

        finish();

    }

    @Override
    public void onItemClick(AdapterView<?> adapterView, View view,
            int position, long id) {
        // TODO Auto-generated method stub

            adapter.toggle(position);


    }

    public void getAllCallLogs(ContentResolver cr) {

        Cursor phones = cr.query(
                ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null,
                null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
                        + " ASC");
        while (phones.moveToNext()) {
            phoneNumber = phones
                    .getString(phones
                            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            name = phones
                    .getString(phones
                            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));

            list.add(new ProfileBean(name, phoneNumber));

        }
        phones.close();
    }
}

可搜索适配器

public class SearchableAdapter extends BaseAdapter implements Filterable, OnCheckedChangeListener {

    public SparseBooleanArray mCheckStates;
    private List<ProfileBean>originalData = null;
    private List<ProfileBean>filteredData = null;
    private LayoutInflater mInflater;
    private ItemFilter mFilter = new ItemFilter();

    public SearchableAdapter(Context context, List<ProfileBean> data) {
        //mCheckStates = new SparseBooleanArray(filteredData.size());
        mCheckStates = new SparseBooleanArray(data.size());
        this.filteredData = data ;
        this.originalData = data ;
        mInflater = LayoutInflater.from(context);
    }

    public int getCount() {
        return filteredData.size();
    }

    public Object getItem(int position) {
        return filteredData.get(position);
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {

         ViewHolder holder;
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.row, null);


                holder = new ViewHolder();
                holder.name = (TextView) convertView.findViewById(R.id.textView1);
                holder.number = (TextView) convertView.findViewById(R.id.textView2);
                holder.chk = (CheckBox) convertView.findViewById(R.id.checkBox1);
                holder.chk.setTag(position);
                convertView.setTag(R.layout.row,holder);
            } else {
                holder = (ViewHolder) convertView.getTag(R.layout.row);
            }
            holder.chk.setOnCheckedChangeListener(null);

            holder.chk.setOnCheckedChangeListener(this);

            ProfileBean bean = filteredData.get(position);
            holder.name.setText(bean.getName());
            holder.number.setText(bean.getNumber());
            convertView.setTag(bean);
            return convertView;
        }

    static class ViewHolder {
        TextView name;
        TextView number;
        CheckBox chk;
    }

    public boolean isChecked(int position) {

        return mCheckStates.get(position, false);
    }

    public void setChecked(int position, boolean isChecked) {
        mCheckStates.put(position, isChecked);
    }

    public void toggle(int position) {
        setChecked(position, !isChecked(position));
    }



    public Filter getFilter() {
        return mFilter;
    }

    private class ItemFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

            String filterString = constraint.toString().toLowerCase();

            FilterResults results = new FilterResults();

            final List<ProfileBean> list = originalData;

            int count = list.size();
            final ArrayList<ProfileBean> nlist = new ArrayList<ProfileBean>(count);

            String filterableString ;

            for (int i = 0; i < count; i++) {

                ProfileBean bean =  list.get(i);
                filterableString = bean.getName();
                if (filterableString.toLowerCase().contains(filterString.toString().toLowerCase())) {
                    nlist.add(bean);
                }
            }

            results.values = nlist;
            results.count = nlist.size();

            return results;
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            filteredData = (ArrayList<ProfileBean>) results.values;
            notifyDataSetChanged();
        }

    }





    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        // TODO Auto-generated method stub
        mCheckStates.put((Integer) buttonView.getTag(), isChecked);
    }




}

ProfileBean 类

public class ProfileBean {
    private String name;
    private String number;
    //private boolean checked = false ;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getNumber() {
        return number;
    }
    public void setNumber(String number) {
        this.number = number;
    }


    public ProfileBean(String name, String number) {
        super();
        this.name = name;
        this.number = number;

    }



        }

最佳答案

像这样改变你的适配器..

public class SearchableAdapter extends BaseAdapter implements Filterable,
    OnCheckedChangeListener {

public SparseBooleanArray mCheckStates;
private List<ProfileBean> originalData = null;
private List<ProfileBean> filteredData = null;
private LayoutInflater mInflater;
private ItemFilter mFilter = new ItemFilter();

public SearchableAdapter(Context context, List<ProfileBean> data) {
    // mCheckStates = new SparseBooleanArray(filteredData.size());
    mCheckStates = new SparseBooleanArray(data.size());
    this.filteredData = data;
    this.originalData = data;
    mInflater = LayoutInflater.from(context);
}

public int getCount() {
    return filteredData.size();
}

public Object getItem(int position) {
    return filteredData.get(position);
}

public long getItemId(int position) {
    return position;
}

public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder holder;
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.row, null);

        holder = new ViewHolder();
        holder.name = (TextView) convertView.findViewById(R.id.textView1);
        holder.number = (TextView) convertView.findViewById(R.id.textView2);
        holder.chk = (CheckBox) convertView.findViewById(R.id.checkBox1);
        holder.chk.setTag(position);
        convertView.setTag(R.layout.row, holder);
    } else {
        holder = (ViewHolder) convertView.getTag(R.layout.row);
    }

    ProfileBean bean = filteredData.get(position);
    holder.name.setText(bean.getName());
    holder.number.setText(bean.getNumber());
    holder.chk.setOnCheckedChangeListener(null);
    holder.chk.setChecked(bean.isChecked);
    holder.chk.setOnCheckedChangeListener(this);
    convertView.setTag(bean);
    return convertView;
}

static class ViewHolder {
    TextView name;
    TextView number;
    CheckBox chk;
}

public void toggle(int position) {
    ProfileBean bean = filteredData.get(position);
    bean.isChecked = !bean.isChecked;
}

public android.widget.Filter getFilter() {
    return mFilter;
}

private class ItemFilter extends android.widget.Filter {

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {

        String filterString = constraint.toString().toLowerCase();

        FilterResults results = new FilterResults();

        final List<ProfileBean> list = originalData;

        int count = list.size();
        final ArrayList<ProfileBean> nlist = new ArrayList<ProfileBean>(
                count);

        String filterableString;

        for (int i = 0; i < count; i++) {

            ProfileBean bean = list.get(i);
            filterableString = bean.getName();
            if (filterableString.toLowerCase().contains(
                    filterString.toString().toLowerCase())) {
                nlist.add(bean);
            }
        }

        results.values = nlist;
        results.count = nlist.size();

        return results;
    }

    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint,
            FilterResults results) {
        filteredData = (ArrayList<ProfileBean>) results.values;
        notifyDataSetChanged();
    }
}

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    // TODO Auto-generated method stub
    int position = (Integer) buttonView.getTag();
    ProfileBean profileBean = filteredData.get(position);
    profileBean.isChecked = isChecked;
    // mCheckStates.put((Integer) buttonView.getTag(), isChecked);

}
}

你的 bean 类就像..

public class ProfileBean {
private String name;
private String number;
public boolean isChecked;

// private boolean checked = false ;
public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getNumber() {
    return number;
}

public void setNumber(String number) {
    this.number = number;
}

public ProfileBean(String name, String number) {
    super();
    this.name = name;
    this.number = number;

}

}

并保持不变..像这样尝试,如果有任何问题请告知..

像这样更改您的 onBkpress 方法..

@Override
public void onBackPressed() {
    phno0.clear();
    for (ProfileBean bean : list) {
        if (bean.isChecked) {
            phno0.add(bean.getNumber());
        } else {
            System.out.println("..Not Checked......"
                    + list.get(i).getNumber().toString());
        }
    }

    Intent returnIntent = new Intent();
    returnIntent.putStringArrayListExtra("name", phno0);
    setResult(RESULT_OK, returnIntent);

    finish();
}

关于android - 复选框的位置得到改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22854486/

相关文章:

Android OpenGL 相机预览问题

android - 从 webview 中的 pdf 文件的超链接加载 pdf 查看器

javascript - 使用 Jquery 将元素的 html 内容复制到另一个元素,不适用于复选框状态(选中、未选中)?

javascript - 禁用的复选框按钮在 JQuery 中不起作用

r - 在 R 中满足条件后过滤组中的后续行

javascript - 在 Javascript 中过滤数组并将其引用为对象数组

android - 如何在 Kotlin 中为 ObjectAnimator 添加监听器?

android - 如何在 Android 中录制音频并将其保存在数据库中?

html - 将复选框与标签对齐并为选中的复选框添加背景颜色

c++ - 如何在 C++ 中过滤字符串 vector ?