Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Establezca onItemClick en Adaptador personalizado ListView

Cuando tuve problemas tratando de arreglar la posición de mis elementos listView a la intención deseada cuando se filtró, y tengo información que podría anular el problema utilizando un adaptador personalizado, lo he hecho pero no sé cómo asignar los clics a cada elemento , Compruebe abajo el código:

public class IndexPageActivity extends Activity { ListView listView; EditText editTextB; @Override protected void onCreate(Bundle savfedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.indexpage); listView = (ListView) findViewById(R.id.pageList); editTextB = (EditText) findViewById(R.id.searchB); listView.setAdapter(new PagesAdapter(this)); listView.setOnItemClickListener((OnItemClickListener) this); } } class SingleRow { String pagedata; SingleRow(String pagedata){ this.pagedata=pagedata; } } class PagesAdapter extends BaseAdapter implements OnItemClickListener{ ArrayList<SingleRow> pagelist; Context context; PagesAdapter(Context c){ context=c; pagelist = new ArrayList<SingleRow>(); Resources res = c.getResources(); String [] pagedatas = res.getStringArray(R.array.pages_data); for (int i=0;i<463;i++){ pagelist.add(new SingleRow(pagedatas[i])); } } @Override public int getCount() { // TODO Auto-generated method stub return pagelist.size(); } @Override public Object getItem(int i) { // TODO Auto-generated method stub return pagelist.get(i); } @Override public long getItemId(int i) { // TODO Auto-generated method stub return i; } @Override public View getView(int i, View view, ViewGroup viewG) { // TODO Auto-generated method stub LayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View row=inflater.inflate(R.layout.single_row,viewG,false); TextView pagetitle = (TextView) row.findViewById(R.id.textViewRow); SingleRow temp=pagelist.get(i); pagetitle.setText(temp.pagedata); return row; } @Override public void onItemClick(AdapterView<?> arg0, View arg1, int i, long arg3) { // TODO Auto-generated method stub } } 

Apreciaré cualquier ayuda dada. ¡Gracias a Yhu!

EDITAR

esto funcionara?

  if (index == 0) { Intent i = new Intent(this, WebViewActivity.class); i.putExtra("keyHTML", "file:///android_asset/page1.html"); startActivity(i); } else if (index == 1) { Intent i = new Intent(this, WebViewActivity.class); i.putExtra("keyHTML", "file:///android_asset/page2.html"); startActivity(i); 

3 Solutions collect form web for “Establezca onItemClick en Adaptador personalizado ListView”

Editado TODO

Acabo de recibir lo que necesitas, agregué un filtro a tu baseAdapter y luego al cambio de texto dentro del editText listView el listView y luego vas a la actividad necesaria.

Aquí está el código completo, pero es necesario tener en cuenta que he cambiado lo siguiente:

  • He cambiado la lista de páginas a ArrayList en lugar de
  • Hay un error en el filtrado que cuando EditText lo que escribí en el EditText no actualiza el ListView, usted necesita para averiguar por qué.
  • Cambié el valor devuelto de la función getItem(int i) de objeto a cadena
  • Dentro de la onItemClick usted tiene que buscar el nombre en lugar de la posición.

Aquí está el código:

 public class IndexPageActivity extends Activity implements OnItemClickListener{ ListView listView; EditText editTextB; PagesAdapter adapter1; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.pageList); editTextB = (EditText) findViewById(R.id.searchB); adapter1 = new PagesAdapter(this); listView.setAdapter(adapter1); adapter1.notifyDataSetChanged(); listView.setOnItemClickListener(this); editTextB.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { // When user changed the Text IndexPageActivity.this.adapter1.getFilter().filter(cs.toString()); adapter1.notifyDataSetChanged(); } @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 } }); } @Override public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) { // TODO Auto-generated method stub Intent i; String name = adapter1.getItem(position); Log.d("id", name); if (name.equals("Item1")) { i = new Intent(this, anActivity.class); startActivity(i); } else if (name.equals("Item2")) { i = new Intent(this, anActivity2.class); startActivity(i); } } } class SingleRow { String pagedata; SingleRow(String pagedata){ this.pagedata=pagedata; } } class PagesAdapter extends BaseAdapter implements Filterable{ ArrayList<String> pagelist; List<String> arrayList; Context context; String [] pagedatas; PagesAdapter(Context c){ context=c; pagelist = new ArrayList<String>(); Resources res = c.getResources(); pagedatas = res.getStringArray(R.array.pages_data); for (int i=0;i<463;i++){ pagelist.add(pagedatas[i]); } } @Override public int getCount() { // TODO Auto-generated method stub return pagelist.size(); } @Override public String getItem(int i) { // TODO Auto-generated method stub return pagelist.get(i); } @Override public long getItemId(int i) { // TODO Auto-generated method stub return i; } @Override public View getView(int i, View view, ViewGroup viewG) { // TODO Auto-generated method stub LayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View row=inflater.inflate(R.layout.single_row,viewG,false); TextView pagetitle = (TextView) row.findViewById(R.id.textViewRow); String temp=pagelist.get(i); pagetitle.setText(temp); return row; } public class filter_here extends Filter{ @Override protected FilterResults performFiltering(CharSequence constraint) { // TODO Auto-generated method stub FilterResults Result = new FilterResults(); // if constraint is empty return the original names if(constraint.length() == 0 ){ Result.values = pagelist; Result.count = pagelist.size(); return Result; } ArrayList<String> Filtered_Names = new ArrayList<String>(); String filterString = constraint.toString().toLowerCase(); String filterableString; for(int i = 0; i<pagelist.size(); i++){ filterableString = pagelist.get(i); if(filterableString.toLowerCase().contains(filterString)){ Filtered_Names.add(filterableString); } } Result.values = Filtered_Names; Result.count = Filtered_Names.size(); return Result; } @Override protected void publishResults(CharSequence constraint,FilterResults results) { // TODO Auto-generated method stub pagelist = (ArrayList<String>) results.values; notifyDataSetChanged(); } } @Override public Filter getFilter() { // TODO Auto-generated method stub return new filter_here(); } } 

Dos maneras diferentes para ello:

1) Si desea utilizar algo como esto en onCreate de su actividad;

listView.setOnItemClickListener((OnItemClickListener) this);

Debe implementar OnItemClickListener en su actividad:

 IndexPageActivity extends Activity implements OnItemClickListener 

E implementar su método onItemClick en su actividad. (También eliminar la interfaz OnItemClickListener de su adaptador personalizado)

2) Simplemente puede utilizar abajo sin implementar OnItemClickListener a cualquier clase:

 listView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // TODO: handle row clicks here } 

Sugiero la segunda opción. Eso es más fácil.

Editar: Esto no es relevante para su problema, pero debe reutilizar sus vistas / filas en listView. Cambie su método getView a:

 @Override public View getView(int position, View convertView, ViewGroup parent) { View view; if (convertView == null) { LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(R.layout.single_row, parent, false); } else { view = convertView; } TextView pagetitle = (TextView) view.findViewById(R.id.textViewRow); SingleRow temp=pagelist.get(i); pagetitle.setText(temp.pagedata); return view; } 

Establezca su setOnItemClickListenerlike esto:

 @Override protected void onCreate(Bundle savfedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.indexpage); listView = (ListView) findViewById(R.id.pageList); editTextB = (EditText) findViewById(R.id.searchB); listView.setAdapter(new PagesAdapter(this)); listView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //Your code here //int position is the index of the list item you clicked //use it to manipulate the item for each click } }); } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.