自定义适配器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
不被调用的唯一原因是:
-
getCount
返回0。 - 你忘了在
ListView
上调用setAdapter
。 - 如果
ListView
的可见性(或其容器的可见性)为GONE
。 感谢@TaynãBonaldo提供的宝贵意见。 -
ListView
不附加到任何视口布局。 也就是说,mListView = new ListView(...)
使用没有myLayout.addView(mListView)
。
在onPostExcute
,创build一个新的CarListAdapter
实例后,我会build议你将新的实例更新到你的ListView
。 确实,你需要再次打电话
mList.setAdapter(adapter);
编辑: setAdapter
应始终在ui线程上调用,以避免意外的行为
EDIT2:
这同样适用于RecyclerView
。 确保
-
getItemCount
返回的值大于0
(通常是数据集的大小) - 必须在
UI Thread
上调用setLayoutManager
和setAdapter
- 小部件的可见性必须设置为可见
您必须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
- jqgrid + EF + MVC:如何在Excel中导出? 你build议哪种方法?
- 是否可以使用Firebase云消息传递(FCM)直接从设备发送PushNotifications到特殊的UDID?
- 如何更新/刷新RecyclerView中的特定项目
- 无法修改ListView中的ArrayAdapter:UnsupportedOperationException
- 如何在运行时设置属性“android:drawableTop”
- Android.app片段与android.support.v4.app使用ViewPager?
- 具有Androidtesting的Android应用程序中的依赖冲突错误
- 用Eclipse创build一个java库
- Html.fromHtml()已被弃用,替代方法是什么?
- Android:BitmapFactory.decodeStream()内存不足,带有2MB空闲堆的400KB文件
- Android – 自定义用户界面与自定义属性