自定义适配器getView()方法不被调用

这里是我在其中设置自定义适配器到列表的片段的代码。

没有错误,但ListView是空的。 我已经实现了getCount() ,它返回我的ArrayList中正确数量的项目。 在logcat中我看不到("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. 你忘了在ListView上调用setAdapter
  3. 如果ListView的可见性(或其容器的可见性)为GONE 。 感谢@TaynãBonaldo提供的宝贵意见。
  4. ListView不附加到任何视口布局。 也就是说, mListView = new ListView(...)使用没有myLayout.addView(mListView)

onPostExcute ,创build一个新的CarListAdapter实例后,我会build议你将新的实例更新到你的ListView 。 确实,你需要再次打电话

  mList.setAdapter(adapter); 

编辑: setAdapter应始终在ui线程上调用,以避免意外的行为

EDIT2:

这同样适用于RecyclerView 。 确保

  • getItemCount返回的值大于0 (通常是数据集的大小)
  • 必须在UI Thread上调用setLayoutManagersetAdapter
  • 小部件的可见性必须设置为可见

您必须validation列表中包含的元素在将项目添加到列表时可能会有错误。 要validation,请使用以下方法:

 adapter.getCount(); 

我面临类似的问题。 这是一个简单的解决方法:

在你的onCreateView,你必须等待视图被创build之前。 所以改变你的线路:

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

希望这能帮助那些会遇到类似问题的人

您在构造函数中缺less超类。 看到我的例子如下:

 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