studio example ejemplo editar diseño dinamico desplegable custom con cargar android android-adapter

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:

  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

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