Estoy tratando de implementar el filtrado de un ListView que utiliza un adaptador de objeto personalizado, pero no puedo encontrar ninguna muestra útil. El código incluido está muy simplificado, así que no, tenga en cuenta que no puedo usar un ArrayAdapter regular. Tengo un EditText encima de ListView, y cuando el usuario ingresa texto en el widget EditText me gustaría filtrar el ListView por el texto escrito en EditText. ¡Cualquier sugerencia sería muy apreciada!Filtrado ListView con adaptador personalizado (objeto)
Aquí es el fragmento de la clase de actividad:
public class management_objects extends Activity {
private static List<User> UserList;
private EfficientAdapter adapter = null;
private ListView objectListView = null;
private EditText SearchText = null;
private static class EfficientAdapter extends BaseAdapter implements Filterable{
private LayoutInflater mInflater;
public EfficientAdapter(Context context) {
mInflater = LayoutInflater.from(context);
}
public int getCount() {
return UserList.size();
}
public Object getItem(int position) {
return 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.imagelayout_2lines, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.managementObjectText);
holder.subtext = (TextView) convertView.findViewById(R.id.managementObjectSubText);
holder.icon = (ImageView) convertView.findViewById(R.id.managementObjectIcon);
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText(UserList.get(position).getFirstName());
holder.subtext.setText(UserList.get(position).getLastName());
holder.icon.setImageResource(R.drawable.user);
return convertView;
}
static class ViewHolder {
TextView text;
TextView subtext;
ImageView icon;
}
@Override
public Filter getFilter() {
return null;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.adobjectlist);
Bundle extras = getIntent().getExtras();
SearchText = (EditText) findViewById(R.id.SearchBox);
SearchText.addTextChangedListener(filterTextWatcher);
objectListView = (ListView) findViewById(R.id.ObjectList);
objectListView.setOnItemClickListener(Item_Click);
adapter = new EfficientAdapter(this);
ComputerName = extras.getString("COMPUTER_NAME");
//Get User list from webservice
ShowUsers();
}
Aquí está la clase Usuario:
public class User {
private int UserId;
private String FirstName;
private String LastName;
public int getUserId() {
return UserId;
}
public void setUserId(int UserId) {
this.UserId = UserId;
}
public String getFirstName() {
return FirstName;
}
public void setFirstName(String FirstName) {
this.FirstName = FirstName;
}
public String getLastName() {
return LastName;
}
public void setLastName(String LastName) {
this.LastName = LastName;
}
}
¿Por qué dices "anular" en 3)? BaseAdapter no tiene getFilter(). – Ixx
Buena captura - no es necesario. Mi clase adaptadora personalizada (en realidad hereda de AmazingAdapter desde el widget de código abierto de AmazingListView) implementa la interfaz android.widget.Filterable que requiere getFilter(). – DustinB
[Este tutorial] (http://www.survivingwithandroid.com/2012/10/android-listview-custom-filter-and.html) me ayudó. La respuesta tenía algunas cosas poco claras, o tal vez no lo leí con suficiente concentración. – Sufian