我有一个自定义列表视图,它显示图像、文本视图和单选按钮。我一次只需要选择一个项目(即 RadioButton)。我在这个列表视图上附加了一个文本观察器,一切正常。
问题出在这里
- 让我们假设在列表视图中我选择了第一个单选按钮。
- 我在 EditText 框中执行了搜索选项,显示它过滤了列表视图项,过滤后的列表项/项将显示在第一个位置。
- 这里第一个位置的过滤项目也被检查(因为它之前被选中)
过滤前是否需要保存单选按钮的状态?
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
if ( row == null) {
// Log.d(tag,"Starting XML Row Inflation");
LayoutInflater inflater = (LayoutInflater) this.getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.custom_row_view_user, parent, false);
Log.d(tag,"Successfully completed XML Row Inflation for positon"+position);
}
// Get item
final Contact contact = getItem(position);
contactIcon = (ImageView) row.findViewById(R.id.image_icon);
name = (TextView) row.findViewById(R.id.textviewname);
name.setText(contact.name);
rb = (RadioButton) row.findViewById(R.id.radiobutton1);
rb.setEnabled(true);
String imgFilePath = DIR + contact.imageId;
try {
Bitmap bitmap = BitmapFactory.decodeStream(this.context.getResources().getAssets().open(imgFilePath));
contactIcon.setImageBitmap(bitmap);
} catch(IOException e) {
e.printStackTrace();
}
return row;
}
// Filter function
@Override
public Filter getFilter() {
if (filter == null) {
filter = new ContactFilter();
}
return filter;
}
private class ContactFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence prefix) {
FilterResults results = new FilterResults();
if( prefix == null || prefix.length() == 0) {
synchronized (this) {
results.values = originalContacts;
results.count = originalContacts.size();
}
} else {
synchronized (this) {
String prefixString = prefix.toString().toLowerCase();
final ArrayList<Contact> filteredItems = new ArrayList<Contact>();
final ArrayList<Contact> localItems = new ArrayList<Contact>();
localItems.addAll(originalContacts);
final int count = localItems.size();
for ( int i=0; i<count; i++) {
final Contact contact = localItems.get(i);
final String contactName = contact.name.toString().toLowerCase();
if ( contactName.startsWith(prefixString) ) {
filteredItems.add(contact);
} else {
}
}
results.values = filteredItems;
results.count = filteredItems.size();
} // end of synchronized.
}
return results;
}
@Override
protected void publishResults(CharSequence prefix,
FilterResults results) {
synchronized (this) {
@SuppressWarnings("unchecked")
final ArrayList<Contact> localItems = (ArrayList<Contact>)results.values;
notifyDataSetChanged();
clear();
for( Iterator<Contact> iterator = localItems.iterator(); iterator.hasNext();) {
Contact index = (Contact) iterator.next();
add(index);
}
} // end of syncronized
}
}
接触类型类
public class Contact {
public String name;
public String imageId;
public String type;
public boolean isSelected;
public boolean useDefaultKey;
public boolean flag;
public Contact() {
}
public Contact(String name, String type, String resouceFilePath) {
this.name = name;
this.type = type;
this.imageId = resouceFilePath;
this.isSelected = false;
this.useDefaultKey = true;
this.flag = false;
}
@Override
public String toString() {
return this.name;
}
public boolean getCheckeBoxStatus() {
return isSelected;
}
}
我实现了LinearLayout检查方法如下
public class CheckableLinearLayout extends LinearLayout implements Checkable{
private RadioButton rb;
public CheckableLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
@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 RadioButton) {
rb = (RadioButton)v;
}
}
}
@Override
public boolean isChecked() {
return rb != null ? rb.isChecked() : false;
}
@Override
public void setChecked(boolean checked) {
if (rb != null) {
// Toast.makeText(getContext(), "Clicked radio buttton", Toast.LENGTH_LONG).show();
rb.setChecked(checked);
}
}
@Override
public void toggle() {
if (rb != null) {
rb.toggle();
rb.setChecked(false);
}
}}
任何帮助是极大的赞赏..