Después de buscar elementos de ListView en Android, siempre abra el primer elemento de ListView (Issue)

Cuando abrí el elemento buscado, está abriendo el primer elemento de ListView no el buscado. Incluso si busca y encuentra los artículos con éxito.

Permítanme dar ejemplos:

  • Si busco Arrow , puedo obtener la Arrow pero cuando se hace clic en Arrow va a Almost Human , Almost Human es mi primer elemento de ListView
  • Si busco American , estoy recibiendo The Americans (first) y el American Horror Story (second) (dos resultados) el proceso de búsqueda es exitoso pero si hace clic en The Americans (second one) va al segundo elemento de ListView.

¿Qué me estoy perdiendo?

Mi código de búsqueda:

  search.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { // When user changed the Text MainActivity.this.adapter.getFilter().filter(cs); } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } @Override public void afterTextChanged(Editable arg0) { // TODO Auto-generated method stub } }); } 

Y aquí está el CustomListViewAdapter.java

  public class CustomListViewAdapter extends ArrayAdapter<RowItem> { Context context; public CustomListViewAdapter(Context context, int resourceId, List<RowItem> items) { super(context, resourceId, items); this.context = context; } /* private view holder class */ private class ViewHolder { ImageView imageView; TextView txtTitle; TextView txtDesc; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; RowItem rowItem = getItem(position); LayoutInflater mInflater = (LayoutInflater) context .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); if (convertView == null) { convertView = mInflater.inflate(R.layout.list_item, null); holder = new ViewHolder(); holder.txtDesc = (TextView) convertView.findViewById(R.id.desc); holder.txtTitle = (TextView) convertView.findViewById(R.id.title); holder.imageView = (ImageView) convertView.findViewById(R.id.icon); convertView.setTag(holder); } else holder = (ViewHolder) convertView.getTag(); holder.txtDesc.setText(rowItem.getDesc()); holder.txtTitle.setText(rowItem.getTitle()); // holder.imageView.setImageBitmap(rowItem.getImageId()); ImageView img = (ImageView) convertView.findViewById(R.id.icon); ImageView gif = (ImageView) convertView.findViewById(R.id.icon); // UrlImageViewHelper.loadUrlDrawable(context, rowItem.getImageId()); Ion.with(gif).load("http://www.example.com/wp-content/uploads/2014/03/android-icon/loading.gif"); Drawable drawable=gif.getDrawable(); UrlImageViewHelper.setUrlDrawable(img, rowItem.getImageId(),drawable, 600000); return convertView; } } 

RowItem.java

  public class RowItem<T> { private String imageId; private String title; private String desc; public RowItem(String imageId, String title, String desc) { this.imageId = imageId; this.title = title; this.desc = desc; } public String getImageId() { return imageId; } public void setImageId(String imageId) { this.imageId = imageId; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } @Override public String toString() { return title + "\n" + desc; } } 

MainActiviy.java

  protected void onCreate(Bundle onSaveInstanceState ) { super.onCreate(onSaveInstanceState ); setContentView(R.layout.activity_main); listView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // When clicked, Open the Next Screen Intent r = new Intent(MainActivity.this, KategoriActivity.class); r.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); r.putExtra("cat_img", asd[2][position]); r.putExtra("cat_id", asd[1][position]); r.putExtra("cat_id2", asd[1][position]); r.putExtra("cat_name",asd[0][position]); // r.putExtra("cat_img", bit[1][position]); startActivityForResult(r, position); } }); @Override protected void onPostExecute(String result) { super.onPostExecute(result); try { JSONArray jsonResponse = new JSONArray(result); asd = new String[3][jsonResponse.length()]; rowItems = new ArrayList<RowItem>(); for (int i = 0; i < jsonResponse.length(); i++) { JSONObject js = jsonResponse.getJSONObject(i); asd[0][i] = js.getString("Category_Name"); asd[2][i] = js.getString("Image"); asd[1][i] = js.getString("Term_ID"); RowItem item = new RowItem(asd[2][i], asd[0][i], ""); rowItems.add(item); } adapter = new CustomListViewAdapter(MainActivity.this, R.layout.list_item, rowItems); listView.setAdapter(adapter); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

Espero que puedas ayudarme..

Normalmente, si tiene un ArrayAdapter de un tipo personalizado como RowItem , no controlará automáticamente el filtrado para usted. Después de todo, ¿cómo puede saber qué propiedad de RowItem filtrar? Debe reemplazar el método getFilter y almacenar la lista filtrada por separado de la lista general del adaptador. Algo como esto:

 public class CustomListViewAdapter extends ArrayAdapter<RowItem> { private final ArrayList<RowItem> mItems; private ArrayList<RowItem> mFilteredItems; private final Comparator<Object> mComparator; public CustomListViewAdapter(Context context, int textViewResourceId, List<RowItem> items) { super(context, textViewResourceId); mItems = new ArrayList<RowItem>(items); mFilteredItems = new ArrayList<RowItem>(items); mComparator = new Comparator<Object>() { @Override public int compare(Object o1, Object o2) { String s1 = ((RowItem)o1).getTitle(); String s2 = ((RowItem)o2).getTitle(); return s1.toLowerCase(Locale.getDefault()).compareTo(s2.toLowerCase()); } }; Collections.sort(mItems, mComparator); Collections.sort(mFilteredItems, mComparator); } @Override public int getCount() { return mFilteredItems.size(); } @Override public RowItem getItem(int position) { return mFilteredItems.get(position); } @Override public int getPosition(RowItem item) { return mFilteredItems.indexOf(item); } @Override public Filter getFilter() { return new Filter() { @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { mFilteredItems = (ArrayList<RowItem>)results.values; if (results.count > 0) { notifyDataSetChanged(); } else { notifyDataSetInvalidated(); } } @Override protected FilterResults performFiltering(CharSequence constraint) { List<RowItem> filteredResults = new ArrayList<RowItem>(); for (RowItem item : mItems) { if (item.getTitle().toLowerCase(Locale.getDefault()).contains(constraint.toString().toLowerCase(Locale.getDefault()))) { filteredResults.add(item); } } Collections.sort(filteredResults, mComparator); FilterResults results = new FilterResults(); results.values = filteredResults; results.count = filteredResults.size(); return results; } }; } } 

Y en MainActivity:

  RowItem item = adapter.getItem(position) r.putExtra("cat_img", item.getImageId()); r.putExtra("cat_id", item.getTermId()); r.putExtra("cat_id2", item.getTermId()); r.putExtra("cat_name", item.getTitle()); 

Usted también tiene que agregar un campo del termid al RowItem, puesto que está en su respuesta de JSON …

Dentro de ArrayAdapter hay dos listas: la lista original con todos los elementos y la lista de elementos actuales en los que el adaptador creará vistas. Al principio, estas dos listas tienen los mismos elementos. Al filtrar en el adaptador, la lista original continuará manteniendo todos los elementos, pero la lista que se utiliza para mostrar cambiará debido al filtro. Al quitar el filtro, la lista actual de elementos cambiará de nuevo para reflejar la lista original.

Supongamos que tiene cinco elementos. Después de filtrar, la lista sólo muestra el último elemento. El estado de estas listas es entonces

 currentItems: { item5 } originalItems: { item1 , item2 , item3 , item4 , item5 } 

Al hacer clic en este elemento, el ListView informa que se hace clic en la posición 0 . Esto se debe a que la lista que se muestra sólo tiene un elemento. Si luego buscó el elemento en la posición 0 en la lista actual, obtendría item5 . Pero si buscó el elemento en la posición 0 de la lista original , obtendría item1 , que no es los datos del elemento al que se hizo clic.

Sospecho que usted tiene una referencia a la lista original y está utilizando eso para conseguir los datos del artículo, incluso cuando la lista se filtra. En su lugar use adapter.getItem(position) , debe darle el elemento adecuado.

Estoy usando algo como esto y su funcionamiento muy bien para mí. Im usando el valor de la cadena en mi lista onsitemclick para la búsqueda y la exhibición de la actividad deseada

 list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String itemValue = (String) list.getItemAtPosition(position); if (itemValue == "INDIA") { Intent intent = new Intent(MainActivity.this, india.class); startActivity(intent);} else if (itemValue == "CHINA") { Intent intent = new Intent(MainActivity.this, china.class); startActivity(intent);} else if (itemValue == "IRAQ") { Intent intent = new Intent(MainActivity.this, usa.class); startActivity(intent); } } 

Obtenga el identificador de elemento listView de la lista que está pasando en // su clase de adaptador.

here por ejemplo si su clase de adaptador es ##

  class CustomAdapetr(Context context,ArrayList<RowItem>list_item){} //mainactivity myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // HERE IS YOUR ITEM ID:):) int clickedItem=list_item.indexOf(parent.getAdapter().getItem(position)); } }); 

¡Salud! Feliz codificación

  • EditarTexto en un ListView
  • Encabezados ListView sin separadores de elementos de lista
  • Android BaseAdapter con Fragmento
  • Mostrando un botón de eliminación en el desplazamiento de un listview para Android
  • Cómo saber qué vista dentro de un elemento ListView específico al que se hizo clic
  • Expanda CardView dentro de RecyclerView como nueva actividad como Inbox de Google Android
  • Agregar la barra de progreso en la parte inferior de una vista de lista
  • Cambiar el texto de un botón dentro de un ListView en Android
  • HeaderViewListAdapter se bloquea de forma aleatoria
  • OnItemClickListener no funciona correctamente cuando el adaptador contiene un botón con onClickListener
  • Android: ¿Los elementos de las listas no se vuelven naranjas cuando se hace clic?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.