personalizado - listview dinamico android studio
No se puede hacer clic en los elementos ListView. ¿por qué? (11)
Tengo un ListView
que usa un adaptador personalizado, pero no puedo hacer clic en el elemento ListView.
Actividad para ver la lista ...
package com.adhamenaya.projects;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.adhamenaya.classes.Place;
public class PlacesListActivity extends Activity {
private ArrayList<Place> places;
private ArrayList<String> items;
GridviewAdapter mAdapter;
private ListView lvPlaces;
private EfficientAdapter adap;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.places_list);
lvPlaces = (ListView) this.findViewById(R.id.lvPlaces);
new DowanloadPlaces().execute("");
}
private void bindList(ArrayList<Place> places) {
this.places = places;
// Start creating the list view to show articles
items = new ArrayList<String>();
for (int i = 0; i < places.size(); i++) {
items.add(String.valueOf(places.get(i).mName));
}
adap = new EfficientAdapter(this);
adap.notifyDataSetChanged();
lvPlaces.setAdapter(adap);
}
// EfficientAdapter : to make a customized list view item
public class EfficientAdapter extends BaseAdapter implements Filterable {
// The function of inflater to convert objects from XML layout file (i.e. main.xml) to a programmable
LayoutInflater inflater;
Context context;
public EfficientAdapter(Context context) {
inflater = LayoutInflater.from(context);
this.context = context;
}
public int getCount() {
// Get the number of items in the list
return items.size();
}
public Object getItem(int position) {
// To return item from a list in the given position
return items.get(position);
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
public View getView(final int position, View convertView,ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.adaptor_content, null);
holder = new ViewHolder();// Create an object to hold at components in the list view item
holder.textLine = (TextView) convertView.findViewById(R.id.textLine);
holder.buttonLine = (Button) convertView.findViewById(R.id.buttonLine);
holder.buttonLine.setOnClickListener(new OnClickListener() {
private int pos = position;
public void onClick(View v) {
places.remove(pos);
bindList(places);// to bind list items
Toast.makeText(getApplicationContext(),"Deleted successfuly :)", Toast.LENGTH_LONG).show();
}
});
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
// Bind the data efficiently with the holder.
holder.textLine.setText(String.valueOf(places.get(position).mName));
return convertView;
}
public Filter getFilter() {
// TODO Auto-generated method stub
return null;
}
}
// ViewHolder : class that represents a list view items
static class ViewHolder {
TextView textLine;
Button buttonLine;
}
// DownloadRSSFeedsTask: works in a separate thread
private class DowanloadPlaces extends AsyncTask<String, Void, ArrayList<Place>> {
@Override
protected ArrayList<Place> doInBackground(String... params) {
ArrayList<Place> places = new ArrayList<Place>();
Place p = new Place();
for(int i =0;i<25;i++){
p.mName = "Al Mathaf Hotel";
places.add(p);
}
return places;
}
@Override
protected void onPostExecute(ArrayList<Place> places) {
bindList(places);
}
}
}
layout de places_list.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/lvPlaces">
</ListView>
</LinearLayout>
adaptor_content.xml layout
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textLine"
android:layout_centerVertical="true"
android:src="@drawable/settings" />
</RelativeLayout>
Android no permite seleccionar elementos de la lista que tengan elementos enfocables ( botones ). Modifique el atributo xml del botón a:
android:focusable="false"
Todavía debe poder hacer clic, simplemente no obtendrá enfoque ...
Esta respuesta aquí funcionó para mí: https://.com/a/16536355/5112161
Principalmente, AGREGÓ en LinearLayout o RelativeLayout lo siguiente:
android:descendantFocusability="blocksDescendants"
También necesita QUITAR de todo su xml lo siguiente:
android:focusable="false"
android:focusable="true"
android:clickable="true"
android:clickable="false"
Estaba usando una vista y un botón dentro de la vista de lista, así que he usado:
android:focusable="false"
para <button>
y <view>
...
Después de eso utilicé el siguiente código para mi vista de lista y funcionó
// Attach the adapter to a ListView
ListView listView = (ListView) findViewById(R.id.shipping_item_list);
listView.setAdapter(adapter);
listView.setOnItemClickListener(listPairedClickItem);
private AdapterView.OnItemClickListener listPairedClickItem = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
Toast.makeText(getBaseContext(), "Item ", Toast.LENGTH_LONG).show();
}
};
Llego bastante tarde pero descubrí algo que creo que es interesante sobre esto:
si su adaptador desciende de ArrayAdapter, tanto como lo he intentado, onItemClickListener no se llama.
Sin embargo, si su adaptador desciende de BaseAdapter (por lo que debe implementar getCount () y getItem (), trivial para una matriz) siempre se llama.
Para mí, el problema era que mis elementos dentro de mi ListView tenían clickable
conjunto de clickable
en true
.
Quise agregar un comentario a la respuesta de ruptura, pero no tengo suficiente reputación.
Si está utilizando un adaptador personalizado que extiende el ArrayAdapter, puede sobrescribir con areAllItemsEnabled () y isEnabled (int position) en su clase:
@Override
public boolean areAllItemsEnabled() {
return true;
}
@Override
public boolean isEnabled(int position) {
return true;
}
Lo anterior solucionó mi vista de lista no clicable. Tal vez este comentario también ayude a otros porque el término de búsqueda "lista de Android no se puede hacer clic" es bastante alto en Google.
Se puede hacer clic en los elementos de la vista de lista. Para usarlo, debe establecer el elemento click listener en su vista de lista. Entonces funcionará.
Tuve el mismo problema con un ListView que contenía solo un RadioButton:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<RadioButton
android:id="@+id/userNameRadioButton"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Utilicé RadioButton en cada fila para mostrar la selección de elementos predeterminada, para hacer que ListView manejara los clics que tenía que usar:
radioButton.setFocusableInTouchMode(false);
radioButton.setFocusable(false);
o en el archivo XML:
android:focusable="false"
android:focusableInTouchMode="false"
Por lo tanto, es un problema relacionado con el enfoque ... Con los modificadores anteriores, el foco se dirige a ListView al hacer clic.
intente esto para obtener el foco: View.getFocus ();
set android: clickable = "falso" android: focusable = "fasle"
Considere hacer que el valor del texto sea seleccionable especificando android: textIsSelectable = "true"
No escuches a Google. En el diseño de las filas, establecer
textIsSelectable="false"
Gracias Lint (¡no!)