android - example - El método getView() del adaptador personalizado no se llama
listview desplegable android studio (6)
Las únicas razones por las que getView
no se llama son:
-
getCount
devuelve 0. - te olvidas de llamar a
setAdapter
en elListView
. - Si la visibilidad de
ListView
(o la visibilidad de su contenedor) seGONE
. Gracias a @ TaynãBonaldo por la valiosa contribución. -
ListView
no está asociado a ningún diseño de vista. Es decir,mListView = new ListView(...)
se usa sinmyLayout.addView(mListView)
.
En onPostExcute
, después de crear una nueva instancia de CarListAdapter
, le sugiero que actualice la nueva instancia a ListView
. De hecho, debe volver a llamar
mList.setAdapter(adapter);
Editar: setAdapter
siempre debe setAdapter
en el hilo de la interfaz de setAdapter
, para evitar comportamientos inesperados
Edit2:
Lo mismo se aplica a RecyclerView
. Asegúrate de eso
-
getItemCount
devuelve un valor mayor que0
(generalmente el tamaño del conjunto de datos) - Tanto
setLayoutManager
comosetAdapter
tienen que ser llamados en elUI Thread
- La visibilidad del widget debe establecerse en
VISIBLE
Aquí está el código del fragmento en el que estoy configurando un adaptador personalizado para la lista.
No hay errores, pero el ListView
está vacío. Implementé getCount()
que devuelve el número correcto de elementos en mi ArrayList. No veo ("Inside", "GetView")
en el logcat
Fragmento
public class ServiceCarListFragment extends Fragment {
private String url;
private ArrayList<CarDetail> carDetailList = new ArrayList<CarDetail>();
private CarListAdapter adapter;
private ListView mList;
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
url = getActivity().getIntent().getStringExtra("url");
new DownloadCarDetail().execute(url);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View v = inflater.inflate(R.layout.fragment_service_car_list, container, false);
mList = (ListView) v.findViewById(R.id.list);
mList.setAdapter(adapter);
for (CarDetail car : carDetailList) {
// START LOADING IMAGES FOR EACH STUDENT
car.loadImage(adapter);
}
return v;
}
class DownloadCarDetail extends AsyncTask<String, String, ArrayList<CarDetail>> {
@Override
protected ArrayList<CarDetail> doInBackground(String... params) {
// TODO Auto-generated method stub
ArrayList<CarDetail> carDetailList = JsonParser.parseJson(params[0]);
return carDetailList;
}
@Override
protected void onPostExecute(ArrayList<CarDetail> carDetailList) {
// TODO Auto-generated method stub
ServiceCarListFragment.this.carDetailList = carDetailList;
Log.d("dccs", String.valueOf(ServiceCarListFragment.this.carDetailList.size()));
adapter = new CarListAdapter(getActivity(), ServiceCarListFragment.this.carDetailList);
Log.d("dccs", String.valueOf((adapter.getCount())));
}
}
}
CustomAdapter
public class CarListAdapter extends BaseAdapter {
private ArrayList<CarDetail> items = new ArrayList<CarDetail>();
private Context context;
public CarListAdapter(Context context, ArrayList<CarDetail> items) {
this.context = context;
this.items = items;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return items.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return items.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
Log.d("Inside", "GetView");
LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
ViewHolder holder = null;
CarDetail car = items.get(position);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.car_list_row, null);
holder = new ViewHolder();
holder.tvCarName = (TextView) convertView.findViewById(R.id.tvCarName);
holder.tvDailyPriceValue = (TextView) convertView.findViewById(R.id.tvWeeklyPriceValue);
holder.tvWeeklyPriceValue = (TextView) convertView.findViewById(R.id.tvWeeklyPriceValue);
holder.imgCar = (ImageView) convertView.findViewById(R.id.imgCar);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tvCarName.setText(car.getCarName());
if (car.getImage() != null) {
holder.imgCar.setImageBitmap(car.getImage());
} else {
// MY DEFAULT IMAGE
holder.imgCar.setImageResource(R.drawable.ic_action_call);
}
return convertView;
}
static class ViewHolder {
TextView tvCarName;
TextView tvDailyPriceValue;
TextView tvWeeklyPriceValue;
ImageView imgCar;
}
}
Lo que has estado haciendo es
En tu adaptador
public CarListAdapter(Context context , ArrayList<CarDetail> items) {
this.context = context;
this.items = items;
}
en tu Fragmento
adapter = new CarListAdapter(getActivity(),ServiceCarListFragment.this.carDetailList);
Espero que estés usando FragmentActivity
Tienes que llamar
adapter = new CarListAdapter(YOUR_ACTIVITY_CONTEXT, carDetailList);
donde YOUR_ACTIVITY_CONTEXT
será tu FragmentActivity
Me enfrenté a un problema similar. Aquí hay un trabajo simple para resolverlo:
En su onCreateView, tendrá que esperar antes de que se cree la vista. Así que cambia tus líneas de esto:
mList = (ListView)v.findViewById(R.id.list);
mList.setAdapter(adapter);
CAMBIE EL ARRIBA DE DOS LÍNEAS EN:
mList = (ListView)v.findViewById(R.id.list);
mList.post(new Runnable() {
public void run() {
mList.setAdapter(adapter);
}
});
Espero que esto ayude a otros que se encontrarían con un problema similar
Te estás perdiendo la súper clase en el constructor. Ver mi ejemplo a continuación:
public AppDataAdapter(Activity a, int textViewResourceId, ArrayList<AppData> entries) {
super(a, textViewResourceId, entries);
this.entries = entries;
this.activity = a;
}
Yo tuve el mismo problema. Y después de probar todos los consejos anteriores, mi getView todavía no se llamaba. Así que traté de eliminar ScrollView que utilicé fuera de ListView. Entonces el getView funcionó bien. Solo por agregar una posibilidad más. Espero ayudar a alguien
debe verificar que la lista tenga elementos puede tener un error al agregar elementos a su lista. Para verificar, use el método:
adapter.getCount();