Пользовательский метод getView () не вызывается

Вот код фрагмента, в котором я устанавливаю пользовательский адаптер в список.

Там нет ошибок, но ListView пуст. Я реализовал getCount() который возвращает правильное количество элементов в моем ArrayList. Я не вижу ("Inside", "GetView") в логарифме

Фрагмент

 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; } } 

Единственные причины, по которым getView не вызывается:

  1. getCount возвращает 0
  2. Вы забыли вызвать setListAdapter в ListView .
  3. Если видимость ListView (или видимость контейнера) GONE . Спасибо @ TaynãBonaldo за ценный вклад
  4. ListView не привязан к макету видового экрана. То есть, mListView = new ListView(...) используется без myLayout.addView(mListView)

В onPostExcute , после создания нового экземпляра CarListAdapter я предлагаю вам обновить новый экземпляр в ListView . Действительно, вам нужно позвонить снова

  mList.setAdapter(adapter); 

Изменить: setAdapter должен всегда вызываться в потоке ui, чтобы избежать неожиданного поведения

Edit2:

То же самое относится к RecyclerView . Убедись, что

  • getItemCount возвращает значение grater чем 0 (обычно размер набора данных)
  • И setLayoutManager и setAdapter должны быть вызваны в setAdapter UI Thread
  • Видимость виджета должна быть установлена ​​в VISIBLE

Вы должны убедиться, что в списке есть элементы, которые могут иметь ошибку при добавлении элементов в ваш список. Чтобы проверить, используйте метод:

 adapter.getCount(); 

Я столкнулся с подобной проблемой. Чтобы решить эту проблему, выполните простую работу:

В вашем onCreateView вам придется подождать до создания представления. Поэтому измените свои строки:

 mList = (ListView)v.findViewById(R.id.list); mList.setAdapter(adapter); 

ИЗМЕНИТЬ ВЫШЕ ДВУХ ЛИНИЙ В:

 mList = (ListView)v.findViewById(R.id.list); mList.post(new Runnable() { public void run() { mList.setAdapter(adapter); } }); 

Надеюсь, это поможет другим, кто столкнется с подобной проблемой

В конструкторе отсутствует суперкласс. См. Мой пример ниже:

 public AppDataAdapter(Activity a, int textViewResourceId, ArrayList<AppData> entries) { super(a, textViewResourceId, entries); this.entries = entries; this.activity = a; } 

То, что вы делаете, это

В адаптере

 public CarListAdapter(Context context , ArrayList<CarDetail> items) { this.context = context; this.items = items; } 

В вашем фрагменте

 adapter = new CarListAdapter(getActivity(),ServiceCarListFragment.this.carDetailList); 

Я надеюсь, что вы будете использовать FragmentActivity

Вам нужно позвонить

 adapter = new CarListAdapter(YOUR_ACTIVITY_CONTEXT, carDetailList); 

Где YOUR_ACTIVITY_CONTEXT будет вашим FragmentActivity