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:
- ¿Está bien cambiar el adaptador de ListView de forma dinámica?
- Simple coursor adaptador con base de datos SQLite y custmize listview
- Elemento de altura fija de Android ListView
- Android: Centrar elementos en un ListVIew
- Android ListView resaltar varios elementos
- Si busco
Arrow
, puedo obtener laArrow
pero cuando se hace clic enArrow
va aAlmost Human
,Almost Human
es mi primer elemento de ListView - Si busco
American
, estoy recibiendoThe Americans (first)
y elAmerican Horror Story (second)
(dos resultados) el proceso de búsqueda es exitoso pero si hace clic enThe 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..
- Obtener el cursor correcto en CustomCursor Adapater getView ()
- Reposicionar la barra de desplazamiento de ListView con relleno
- Desplazamiento en listview con altura de celda diferente
- ¿Es mejor recrear el adaptador listview o borrar y repoblar?
- Establecer la altura de la fila ListView en el código
- Problema al agregar pie de página a ListView
- Eliminación de un elemento de ListView dentro de un adaptador personalizado
- Iniciar un fragmento de diálogo en el botón de clic de un adaptador de base personalizado> getView
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
- No puedo configurar JDK 1.8 en AndroidStudio
- ¿Cuándo usar ArrayMap de Android en lugar de un HashMap?