El método getView() del adaptador personalizado no se llama

Resuelto Ravi asked hace 54 años • 6 respuestas

Aquí está el código del fragmento en el que estoy configurando un adaptador personalizado en la lista.

No hay errores pero ListViewestá 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;
    }

}
Ravi avatar Jan 01 '70 08:01 Ravi
Aceptado

Las únicas razones getViewpor las que no se llama son:

  1. getCountdevuelve 0.
  2. te olvidas de llamar setAdapteralListView .
  3. Si la ListViewvisibilidad de (o la visibilidad de su contenedor) es GONE. Gracias a @TaynãBonaldo por el valioso aporte.
  4. ListViewno está adjunto a ningún diseño de ventana gráfica. Es decir, mListView = new ListView(...)se utiliza sin myLayout.addView(mListView).

En onPostExcute, después de crear una nueva instancia de, CarListAdapterle sugeriré que actualice la nueva instancia a su ListView. De hecho necesitas llamar de nuevo.

 mList.setAdapter(adapter);

Editar: setAdaptersiempre 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

  • getItemCountestá devolviendo un valor mayor que0 (normalmente el tamaño del conjunto de datos)
  • ambos setLayoutManagery setAdapterdeben ser llamados alUI Thread
  • La visibilidad del widget debe establecerse enVISIBLE
Blackbelt avatar May 02 '2013 12:05 Blackbelt

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();
Luis Felipe avatar Feb 03 '2015 17:02 Luis Felipe