0
확인란과 텍스트 뷰로 구성된 맞춤 어댑터가 있습니다. EditText를 통해 필터링을 구현했습니다. 작동합니다. 그러나 내가 필터를 걸면 위치가 바뀐다. 예를 들어 나는 10 개의 체크 박스를 가지고있다. 9 번째 체크 박스에 필터를 걸고 체크 박스를 체크하면 그 위치는 0이되고, EditText를 클리어하면 9 번째 체크 박스가 아닌 첫 번째 체크 박스가 선택됩니다. 어떻게 이것을 유지할 수 있습니까? 내 사용자 정의 어댑터 클래스 :필터링 후 확인란 위치가 변경됨
public class CustomAdapter extends ArrayAdapter<Custom> implements Filterable
{
private ArrayList<Custom> entries;
private Activity activity;
private Context context;
private qrusers qrusers;
Custom data;
CustomFilter customFilter;
private String[] udis;
ArrayList<String> userid= new ArrayList<String>();
boolean[] checkBoxState;
private ArrayList<Custom> orignalvalues;
LayoutInflater vi;
public CustomAdapter(Context context, ArrayList<Custom> entries,String []udis,ArrayList<Custom> orignalvalue) {
super(context,0,entries);
this.entries = entries;
this.context= context;
orignalvalues = new ArrayList<Custom>(entries);
this.udis=udis;
checkBoxState=new boolean[entries.size()];
this.qrusers =(qrusers) context;
vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public static class ViewHolder{
public TextView item1;
public TextView item2;
public CheckBox chek;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return entries.size();
}
@Override
public Custom getItem(int position) {
// TODO Auto-generated method stub
return super.getItem(position);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View v = convertView;
ViewHolder holder;
final Custom i = entries.get(position);
final Custom t = orignalvalues.get(position);
if (v == null) {
v = vi.inflate(R.layout.checkboxlist, null);
holder = new ViewHolder();
holder.item1 = (TextView) v.findViewById(R.id.contactname);
holder.item2 = (TextView) v.findViewById(R.id.companyname);
holder.chek=(CheckBox)v.findViewById(R.id.checboxlist);
data = getItem(position);
holder.chek.setOnCheckedChangeListener(null); //important
holder.chek.setChecked(data.isChecked());
v.setTag(holder);
}
else{
holder=(ViewHolder)v.getTag();
}
holder.chek.setChecked(checkBoxState[position]);
holder.chek.setTag(udis[position]);
holder.chek.setOnClickListener(new OnClickListener() {
private String s;
@Override
public void onClick(View v) {
if (((CheckBox) v).isChecked()){
checkBoxState[position]=true;
data.setChecked(true);
// isChecked=true;
s=(String)v.getTag();
Log.e("IDDDDDDDD", s);
userid.add(s);
Log.e("ADDED ID", userid.toString());
}
else{
checkBoxState[position]=false;
s=(String)v.getTag();
userid.remove(s);
Log.e("Removed ID", userid.toString());
}
SharedPreferences app_preferences = PreferenceManager
.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = app_preferences.edit();
editor.putString("userid", TextUtils.join(",", userid));
editor.commit();
}
}
);
Custom ei = (Custom)i;
if (ei != null) {
holder.item1.setText(ei.getcustomBig());
holder.item2.setText(ei.getcustomSmall());
}
return v;
}
public Filter getFilter() {
if (customFilter == null) {
customFilter = new CustomFilter();
}
return customFilter;
}
public ArrayList<String> getUserid() {
return userid;
}
public void setUserid(ArrayList<String> userid) {
this.userid = userid;
}
private class CustomFilter extends Filter{
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if(constraint == null || constraint.length() == 0) {
entries = new ArrayList<Custom>(orignalvalues);
results.values=entries;
results.count = entries.size();
}
else{
ArrayList<Custom> newValues = new ArrayList<Custom>();
for (Custom i : entries){
if (i.toString().toUpperCase().startsWith(constraint.toString().toUpperCase()))
newValues.add(i);
}
results.count = newValues.size();
results.values = newValues;
Log.e("NEW VALUES", newValues.toString());
}
return results;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
if (results.count == 0){
notifyDataSetInvalidated();
} else {
Log.e("publish result", results.toString());
@SuppressWarnings("unchecked")
ArrayList<Custom> listi = (ArrayList<Custom>)results.values;
ArrayList<Custom> itemsList = new ArrayList<Custom>(listi);
entries =itemsList;
notifyDataSetChanged();
}
}
}
}
이렇게하면 자동으로 체크 박스가 선택됩니다. – user2699728
Holder 클래스에'public boolean isChecked'를 넣습니다. 'holder.chek.setChecked (holder.isChecked)'를 사용하십시오. 그런 다음 확인란이 기본적으로 선택되지 않아야합니다. – novic3