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 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 carDetailList = new ArrayList(); 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> { @Override protected ArrayList doInBackground(String... params) { // TODO Auto-generated method stub ArrayList carDetailList = JsonParser.parseJson(params[0]); return carDetailList; } @Override protected void onPostExecute(ArrayList 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 items = new ArrayList(); private Context context; public CarListAdapter(Context context, ArrayList 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 por las que getView no se llama son:

  1. getCount devuelve 0.
  2. te olvidas de llamar a setAdapter en el ListView .
  3. Si la visibilidad de ListView (o la visibilidad de su contenedor) se GONE . Gracias a @ TaynãBonaldo por la valiosa contribución.
  4. ListView no está asociado a ningún diseño de vista. Es decir, mListView = new ListView(...) se usa sin myLayout.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 que 0 (generalmente el tamaño del conjunto de datos)
  • Tanto setLayoutManager como setAdapter tienen que ser llamados en el UI Thread
  • La visibilidad del widget debe establecerse en VISIBLE

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(); 

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 entries) { super(a, textViewResourceId, entries); this.entries = entries; this.activity = a; } 

Lo que has estado haciendo es

En tu adaptador

 public CarListAdapter(Context context , ArrayList 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

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

    Intereting Posts