El método getView() del adaptador personalizado no se llama
Aquí está el código del fragmento en el que estoy configurando un adaptador personalizado en la lista.
No hay errores pero ListView
está vacío. He implementado getCount()
que devuelve la cantidad correcta 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())));
}
}
}
Adaptador personalizado
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;
}
}
Las únicas razones getView
por las que no se llama son:
getCount
devuelve 0.- te olvidas de llamar
setAdapter
alListView
. - Si la
ListView
visibilidad de (o la visibilidad de su contenedor) esGONE
. Gracias a @TaynãBonaldo por el valioso aporte. ListView
no está adjunto a ningún diseño de ventana gráfica. Es decir,mListView = new ListView(...)
se utiliza sinmyLayout.addView(mListView)
.
En onPostExcute
, después de crear una nueva instancia de, CarListAdapter
le sugeriré que actualice la nueva instancia a su ListView
. De hecho necesitas llamar de nuevo.
mList.setAdapter(adapter);
Editar: setAdapter
siempre se debe llamar en el hilo de la interfaz de usuario, para evitar comportamientos inesperados
Editar2:
Lo mismo se aplica a RecyclerView
. Asegúrate de eso
getItemCount
está devolviendo un valor mayor que0
(normalmente el tamaño del conjunto de datos)- ambos
setLayoutManager
ysetAdapter
deben ser llamados alUI Thread
- La visibilidad del widget debe establecerse en
VISIBLE
debes verificar que la lista tenga elementos, puede haber un error al agregar elementos a tu lista. Para verificar, utilice el método:
adapter.getCount();