1

Fragment 内のビューにアダプターを割り当てる際の Null ポインター。

フラグメントを含むアクティビティがあります。Fragment に GridView を設定したいと考えています。そのために、カスタムアダプターを作成しました-

public class MyBaseAdapter extends BaseAdapter {

        private Context mContext;
        private List<ResolveInfo> mAppList;

        MyBaseAdapter(Context c, List<ResolveInfo> l) {
            mContext = c;
            mAppList = l;
        }
        public int getCount() {
            return mAppList.size();
        }
        public Object getItem(int position) {
            return mAppList.get(position);
        }
        public long getItemId(int position) {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView imageView;
            if (convertView == null) {
                // if it's not recycled, initialize some attributes
                imageView = new ImageView(mContext);
                imageView.setLayoutParams(new GridView.LayoutParams(200, 200));
                imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
                imageView.setPadding(8, 8, 8, 8);
            } else {
                imageView = (ImageView) convertView;
            }

            ResolveInfo resolveInfo = mAppList.get(position);
            imageView.setImageDrawable(resolveInfo
                    .loadIcon(mPackageManager));
            return imageView;
        }
    }

フラグメントを次のように実装しました-

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.grid_of_app, container, false);

        HashMap<String, String> pkClsPair = new HashMap<String, String>();
        pkClsPair.put("com.android.contacts", "com.android.contacts.activities.PeopleActivity");
        pkClsPair.put("com.android.gallery", "com.android.camera.GalleryPicker");

        mPackageManager = getActivity().getPackageManager();
        List<ResolveInfo> intentList = null, intentList_temp = null;

        Intent intent = new Intent(Intent.ACTION_MAIN, null);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        for (Map.Entry<String, String> entry : pkClsPair.entrySet()) {
            intent.setClassName(entry.getKey(), entry.getValue());
            if (intentList == null)
                intentList = getActivity().getPackageManager().queryIntentActivities(intent, 0);
            else {
                intentList_temp = (getActivity().getPackageManager().queryIntentActivities(intent, 0));
                intentList.addAll(intentList_temp);
            }
        }

        mBaseAdapter = new MyBaseAdapter(getActivity(), intentList);
        GridView mGridview = (GridView) getActivity().findViewById(R.id.gridView);
        mGridview.setAdapter(mBaseAdapter);

        mGridview.setOnItemClickListener(mOnItemClickListener);

        return rootView;
    }

ただし、Adapter (mBaseAdapter) を Gridview に割り当てているときに NullPointer Exception が発生するようです。アダプターに適切なコンテキストを提供しているため、機能するはずです(デバッグ中にもチェックしましたが、値はnullではありません)。

前もって感謝します。

4

1 に答える 1

2
GridView mGridview = (GridView) getActivity().findViewById(R.id.gridView);

上記の行getActivity()rootView

于 2013-10-28T12:27:49.933 に答える