永远不会调用自定义适配器的getView()方法

时间:2016-08-29 06:05:13

标签: android listview android-fragments custom-adapter

我已经阅读了有关该主题的各种SO主题,但它们似乎都不适用于我的代码。

我尝试使用自定义的NearbyAdapter使用ListView填充片段。但是,我的getView()方法永远不会被调用(正如我的日志没有显示所示)。视图本身似乎适当地附加到我的片段,如视图中的按钮所示,但不是ListView。

enter image description here

相关的NearbyListFragment.java代码:

public class NearbyListFragment extends ListFragment {

    private int mImageSize;
    private boolean mItemClicked;
    private NearbyAdapter mAdapter;

    private List<Place> places;
    private LatLng mLatestLocation;

    private static final String TAG = "NearbyListFragment";

    public NearbyListFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        Log.d(TAG, "NearbyListFragment created");

        View view = inflater.inflate(R.layout.fragment_nearby, container, false);
        return view;
    }

    //TODO: Do asynchronously?
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {

        //Load from data source (NearbyPlaces.java)

        mLatestLocation = ((NearbyActivity) getActivity()).getmLatestLocation();
        //FIXME: Hardcoding mLatestLocation to Michigan for testing
        //mLatestLocation = new LatLng(44.182205, -84.506836);

        places = loadAttractionsFromLocation(mLatestLocation);
        mAdapter = new NearbyAdapter(getActivity(), places);

        ListView listview = (ListView) view.findViewById(R.id.listview);
        //setListAdapter(mAdapter);
        listview.setAdapter(mAdapter);

        Log.d(TAG, "Adapter set to ListView");
        mAdapter.notifyDataSetChanged();
    }

    private class NearbyAdapter extends ArrayAdapter {

        public List<Place> placesList;
        private Context mContext;

        public NearbyAdapter(Context context, List<Place> places) {
            super(context, R.layout.item_place);
            mContext = context;
            placesList = places;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // Get the data item for this position
            Place place = (Place) getItem(position);
            //FIXME: This never gets called
            Log.d(TAG, "Place " + place.name);

            // Check if an existing view is being reused, otherwise inflate the view
            if (convertView == null) {
                convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_place, parent, false);
            }

            // Lookup view for data population
            TextView tvName = (TextView) convertView.findViewById(R.id.tvName);
            TextView tvDesc = (TextView) convertView.findViewById(R.id.tvDesc);

            // Populate the data into the template view using the data object
            tvName.setText(place.name);
            tvDesc.setText(place.description);

            // Return the completed view to render on screen
            return convertView;
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

片段的布局文件,fragment_nearby.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/listview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_above="@+id/btn_New">
    </ListView>
    <Button
        android:id="@+id/btn_New"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:layout_marginBottom="20dp"
        android:text="Button"
        android:width="170dp"
        android:layout_alignParentBottom="true" />

</RelativeLayout>

项目的布局文件,item_place.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <TextView
        android:id="@+id/tvName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Name" />
    <TextView
        android:id="@+id/tvDesc"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Desc" />
</LinearLayout> 

编辑:有人想要真正包含downvote的原因吗?特别是当像Custom Adapter for List View这样的东西有129个赞成票?

3 个答案:

答案 0 :(得分:1)

问题是ArrayAdapter不知道列表位置: 用它来修复它:

private static class NearbyAdapter extends ArrayAdapter<Place> {
   public NearbyAdapter(Context context, List<Place> places) {
      super(context, R.layout.item_place, places);
      mContext = context;
      placesList = places;
   }
}

P / s:在这种情况下,我认为您需要更多控制权来将地点数据设置为您的视图。考虑使用BaseAdapter而不是ArrayAdapter。

答案 1 :(得分:0)

将以下内容添加到您的适配器:

@Override
public int getCount() {
    return placesList.size();
}

在此之后,您很可能会遇到getItem错误,因此您还需要覆盖该错误,以便从列表中返回您的对象。

答案 2 :(得分:0)

您必须覆盖getCount()中的ArrayAdapter方法,才能初始化列表视图,如下所示:

@Override
    public int getCount() {
        return placesList.size();
    }