Filtro de búsqueda en listview devuelve resultados erróneos en el elemento click

He hecho mi parte justa de la investigación y he encontrado tres casos relacionados con mi problema.

Solución 1

Solución 2

Solución 3

No estoy diciendo que mi caso es único o nada, es jus que no puedo hacer que sus respuestas funcionen para mí con mi cordón.

PROBLEMA: Tengo un listview consigue filtrado por un edit text en tapa. Sin embargo cuando hago clic en el artículo buscado consigo el resultado de otra imagen que es selected.Text trabaja muy bien pero las imágenes son el problema.

Por ejemplo: list tiene filas con imágenes A, B, C, D

Al buscar C obtendrá el resultado filtrado como C. Pero al hacer clic en el resultado se mostrará la imagen de A. Es como si la posición no cambiara para las imágenes pero utilizara la posición original del adaptador ArrayList .

Cualquier ayuda será apreciada.

Mi adaptador:

 public class SearchListAdapter extends BaseAdapter implements Filterable { List<Model> mStringFilterList; ValueFilter valueFilter; ImageLoader imageLoader = AppController.getInstance().getImageLoader(); private Activity activity; private LayoutInflater inflater; private List<Model> modelItems; private int mDefaultImageId; public SearchListAdapter(Activity activity, List<Model> modelItems) { this.activity = activity; this.modelItems = modelItems; mStringFilterList = modelItems; } public void setDefaultImageResId(int defaultImage) { mDefaultImageId = defaultImage; } @Override public int getCount() { return modelItems.size(); } @Override public Object getItem(int location) { return modelItems.get(location); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (inflater == null) inflater = (LayoutInflater) activity .getSystemService(Context.LAYOUT_INFLATER_SERVICE); if (convertView == null) convertView = inflater.inflate(R.layout.search_list_row, null); if (imageLoader == null) imageLoader = AppController.getInstance().getImageLoader(); NetworkImageView thumbNail = (NetworkImageView) convertView .findViewById(R.id.thumbnail); TextView title = (TextView) convertView.findViewById(R.id.title); TextView rating = (TextView) convertView.findViewById(R.id.rating); TextView genre = (TextView) convertView.findViewById(R.id.genre); Model m = modelItems.get(position); // thumbnail image thumbNail.setImageUrl(m.getThumbnailUrl(), imageLoader); thumbNail.setTag(position); // title title.setText(m.getTitle()); // amount rating.setText(String.valueOf(m.getRating())); // description String genreStr = ""; for (String str : m.getGenre()) { genreStr += str + ", "; } genreStr = genreStr.length() > 0 ? genreStr.substring(0, genreStr.length() - 2) : genreStr; genre.setText(genreStr); return convertView; } @Override public Filter getFilter() { if (valueFilter == null) { valueFilter = new ValueFilter(); } return valueFilter; } private class ValueFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); if (constraint != null && constraint.length() > 0) { ArrayList<Model> filterList = new ArrayList<Model>(); for (int i = 0; i < mStringFilterList.size(); i++) if ((mStringFilterList.get(i).getTitle().toUpperCase()) .contains(constraint.toString().toUpperCase())) { Model m = new Model(mStringFilterList.get(i) .getTitle(), mStringFilterList.get(i) .getThumbnailUrl(), mStringFilterList.get(i) .getRating(), mStringFilterList.get(i) .getGenre()); filterList.add(m); } results.count = filterList.size(); results.values = filterList; } else { results.count = mStringFilterList.size(); results.values = mStringFilterList; } return results; } @Override protected void publishResults(CharSequence constraint, FilterResults results) { modelItems = (List<Model>) results.values; notifyDataSetChanged(); } } } 

 lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String name = ((TextView) view.findViewById(R.id.title)) .getText().toString(); bitmap = ((Model) modelList.get(position)).getThumbnailUrl(); String rate = ((TextView) view.findViewById(R.id.rating)) .getText().toString(); String genres = ((TextView) view.findViewById(R.id.genre)) .getText().toString(); Intent intent = new Intent(SearchActivity.this, Details.class); intent.putExtra(Title, name); intent.putExtra("images", bitmap); intent.putExtra(Rate, rate); intent.putExtra(Genre, genres); startActivity(intent); } }); } 

OnItemclickListener:

Puede cambiar el código

 String name = ((TextView) view.findViewById(R.id.title)).getText().toString(); bitmap = ((Model) modelList.get(position)).getThumbnailUrl(); String rate = ((TextView) view.findViewById(R.id.rating)).getText().toString(); String genres = ((TextView) view.findViewById(R.id.genre)).getText().toString(); 

a

 Model model=(Model)adapter.getItem(position); 

Obtendrá el modelo en la posición en la que hizo clic y pasar este modelo como Serialized o lo que desea hacer.

Espero que esto solucione el problema.

utilizar

  Model model = (Model) parent.getItemAtPosition(position); 

Para recuperar el elemento del conjunto de datos y utilizar esta referencia para llenar el objeto Intent . Después de filtrar los elementos en su adaptador, está reemplazando, con modelItems = (List<Model>) results.values; La referencia actual de modelItems .

Editar

 lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Model model = (Model) parent.getItemAtPosition(position); Intent intent = new Intent(SearchActivity.this, Details.class); intent.putExtra(Title, model.getTitle()); intent.putExtra("images", model.getThumbnailUrl()); intent.putExtra(Rate, String.valueOf(model.getRating())); intent.putExtra(Genre, model.getGenre()); startActivity(intent); } }); } 

Parece que está filtrando su adaptador, pero luego obtener un elemento de su lista original no filtrada. Usted debe conseguir el artículo directamente de su adaptador. Agregue el siguiente método a su BaseAdapter:

 public Model getItemAtPosition(int position) { return model.get(position); } 

Y OnItemClickListener desde la implementación de OnItemClickListener :

bitmap = adapter.getItemAtPosition(position).getThumbnailUrl();

El problema es onClickListener devuelve la position=0 , cuando onClick , porque en su ListView filtrado tiene sólo un ítem C index=0 donde el índice zeroth se refiere a la image A , por eso su visualización A image Consulte esto para su solución: Vista de lista filtrada

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.