我的accept_a_request_recycleview.xml中有一个mapFragment。

我想提供它的引用或在我的RVAdapterAAR.javaRecyclerView.ViewHolder中初始化它。

我尝试这样做:mapFragment = (SupportMapFragment) mapFragment.getChildFragmentManager().findFragmentById(R.id.map_fragment);,但是运行该应用程序后,它崩溃并显示此错误:java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v4.app.FragmentManager android.support.v4.app.Fragment.getChildFragmentManager()' on a null object reference at com.abc.xyz.RVAdapterAAR$PersonViewHolder.<init>(RVAdapterAAR.java:48)

这是来自RVAdapterAAR.java文件的完整代码:

    public class RVAdapterAAR extends RecyclerView.Adapter<RVAdapterAAR.PersonViewHolder> {

// step 1
Fragment mFragment;
    RVAdapterAAR(List<ListContentAAR> listContentAARs,Fragment mFragment) {
        this.listContentAARs = listContentAARs;
        this.mFragment=mFragment;
    }

            public static class PersonViewHolder extends RecyclerView.ViewHolder {

                CardView cardView;
                TextView nPicTag;
                ImageView hImage;
                TextView nDescriptionTag;
                TextView hDescription;
                TextView hLocation;
                SupportMapFragment mapFragment;
                Button btn_accept;
                Button btn_share;
                TextView postDate;
                TextView postTime;
                TextView postedBy;

                // step 2
                Fragment mFragment;
                PersonViewHolder(View itemView) {
                    super(itemView);
                    this.mFragment = mFragment;
                    cardView = (CardView) itemView.findViewById(R.id.card_accept_request);
                    nPicTag = (TextView) itemView.findViewById(R.id.n_pic_tag);
                    hImage = (ImageView) itemView.findViewById(R.id.h_pic_accept);
                    nDescriptionTag = (TextView) itemView.findViewById(R.id.n_description_tag);
                    hDescription = (TextView) itemView.findViewById(R.id.h_description_accept);
                    hLocation = (TextView) itemView.findViewById(R.id.currentCoordinatesTagAccept);
                    mapFragment = (SupportMapFragment) mFragment.getChildFragmentManager().findFragmentById(R.id.map_fragment);
                    btn_accept = (Button) itemView.findViewById(R.id.btn_accept);
                    btn_share = (Button) itemView.findViewById(R.id.btn_share);
                    postDate = (TextView) itemView.findViewById(R.id.post_date);
                    postTime = (TextView) itemView.findViewById(R.id.post_time);
                    postedBy = (TextView) itemView.findViewById(R.id.posted_by);
                }

            }

            List<ListContentAAR> listContentAARs;

            RVAdapterAAR(List<ListContentAAR> listContentAARs) {
                this.listContentAARs = listContentAARs;
            }

            public void onAttachedToRecyclerView(RecyclerView recyclerView) {
                super.onAttachedToRecyclerView(recyclerView);
            }

            public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
                View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.fragment_accept_a_request, viewGroup, false);
                PersonViewHolder personViewHolder = new PersonViewHolder(view);
                return personViewHolder;
            }

            public void onBindViewHolder (PersonViewHolder personViewHolder, int i) {
                personViewHolder.nPicTag.setText(listContentAARs.get(i).nPicTag);
                personViewHolder.hImage.setImageBitmap(listContentAARs.get(i).hImage);
                personViewHolder.nDescriptionTag.setText(listContentAARs.get(i).nDescriptionTag);
                personViewHolder.hDescription.setText(listContentAARs.get(i).hDescription);
                personViewHolder.hLocation.setText(listContentAARs.get(i).hLocation);
                 // step 3
                personViewHolder.mapFragment.getChildFragmentManager().findFragmentById(R.id.map_fragment);
                personViewHolder.btn_accept.findViewById(R.id.btn_accept);
                personViewHolder.btn_share.findViewById(R.id.btn_share);
                personViewHolder.postDate.setText(listContentAARs.get(i).postDate);
                personViewHolder.postTime.setText(listContentAARs.get(i).postTime);
                personViewHolder.postedBy.setText(listContentAARs.get(i).postedBy);
            }

            public int getItemCount() {
                return listContentAARs.size();
            }

        }


来自AcceptARequest.java的代码(在其中使用RVAdapterAAR):

public class AcceptARequest extends Fragment implements LocationListener,
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener {

    public List<ListContentAAR> listContentAARs;
    public RecyclerView recyclerView;

    ImageView hPicAccept;
    TextView nPicTag, nDescriptionTag, hDescriptionAccept, hLocationTagAccept, currentCoordinatesTagAccept, post_date, post_time, posted_by;
    String nPicTagAcceptS, nDescriptionTagAcceptS, hDescriptionAcceptS, hLocationTagAcceptS, currentCoordinatesTagAcceptS, post_dateS, post_timeS, posted_byS;
    Button btn_accept, btn_share;
    LinearLayout dateTimeContainer;
    Bitmap bitmap;

    ParseQuery<ParseObject> query;


    private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000;

    private static final int MILLISECONDS_PER_SECOND = 1000;

    private static final int UPDATE_INTERVAL_IN_SECONDS = 5;

    private static final int FAST_CEILING_IN_SECONDS = 1;

        private static final long UPDATE_INTERVAL_IN_MILLISECONDS = MILLISECONDS_PER_SECOND
            * UPDATE_INTERVAL_IN_SECONDS;

    private static final long FAST_INTERVAL_CEILING_IN_MILLISECONDS = MILLISECONDS_PER_SECOND
            * FAST_CEILING_IN_SECONDS;

    private static final float METERS_PER_FEET = 0.3048f;

    private static final int METERS_PER_KILOMETER = 1000;

    private static final double OFFSET_CALCULATION_INIT_DIFF = 1.0;

    private static final float OFFSET_CALCULATION_ACCURACY = 0.01f;

    private static final int MAX_POST_SEARCH_RESULTS = 20;

    private static final int MAX_POST_SEARCH_DISTANCE = 100;

    SupportMapFragment mapFragment;

    Circle mapCircle;

    float radius;
    float lastRadius;

    final Map<String, Marker> mapMarkers = new HashMap<String, Marker>();
    int mostRecentMapUpdate;
    boolean hasSetUpInitialLocation;
    String selectedPostObjectId;
    Location lastLocation;
    Location currentLocation;
    LocationManager locationManager;

    LocationRequest locationRequest;

    GoogleApiClient locationClient;
    ParseGeoPoint myPoint;
    double latitude, longitude;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        locationRequest = LocationRequest.create();

        locationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
            locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

        locationRequest.setFastestInterval(FAST_INTERVAL_CEILING_IN_MILLISECONDS);

        locationClient = new GoogleApiClient.Builder(getContext())
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();

        if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.

            currentLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            if (currentLocation != null) {
                latitude = currentLocation.getLatitude();
                longitude = currentLocation.getLongitude();
            }
            return;
        }
        //currentLocation = LocationServices.FusedLocationApi.getLastLocation(locationClient);
        myPoint = new ParseGeoPoint(latitude, longitude);

        Handler handler1 = new Handler();
        handler1.postDelayed(new Runnable() {
            @Override
            public void run() {
                mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map_fragment);
                mapFragment.getMapAsync(new OnMapReadyCallback() {
                    @Override
                    public void onMapReady(GoogleMap googleMap) {
                        googleMap.setMyLocationEnabled(true);
                        googleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
                            public void onCameraChange(CameraPosition position) {
                                theMainThing();
                            }
                        });
                    }
                });

            }
        }, 1500);

    }

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

        View rootView = inflater.inflate(R.layout.fragment_accept_a_request, container, false);


        listContentAARs = new ArrayList<>();

        nPicTag = (TextView) rootView.findViewById(R.id.n_pic_tag);
        hPicAccept = (ImageView) rootView.findViewById(R.id.h_pic_accept);
        nDescriptionTag = (TextView) rootView.findViewById(R.id.n_description_tag);
        hDescriptionAccept = (TextView) rootView.findViewById(R.id.h_description_accept);
        currentCoordinatesTagAccept = (TextView) rootView.findViewById(R.id.currentCoordinatesTagAccept);
        btn_accept = (Button) rootView.findViewById(R.id.btn_accept);
        btn_share = (Button) rootView.findViewById(R.id.btn_share);
        dateTimeContainer = (LinearLayout) rootView.findViewById(R.id.date_time_container);
        post_date = (TextView) rootView.findViewById(R.id.post_date);
        post_time = (TextView) rootView.findViewById(R.id.post_time);
        posted_by = (TextView) rootView.findViewById(R.id.posted_by);

        nPicTagAcceptS = nPicTag.getText().toString();
        nDescriptionTagAcceptS = nDescriptionTag.getText().toString();
        hDescriptionAcceptS = hDescriptionAccept.getText().toString();
        currentCoordinatesTagAcceptS = currentCoordinatesTagAccept.getText().toString();
        post_dateS = post_date.getText().toString();
        post_timeS = post_time.getText().toString();
        posted_byS = posted_by.getText().toString();

        currentCoordinatesTagAccept.setVisibility(View.INVISIBLE);

        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
               theMainThing();
            }
        }, 1000);

        recyclerView = (RecyclerView) rootView.findViewById(R.id.accept_request_list);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.setHasFixedSize(true);
        recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), recyclerView, new ClickListener() {
            @Override
            public void onClick(View view, int position) {
                Button btnAccept = (Button) view.findViewById(R.id.btn_accept);
                btnAccept.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                        builder.setMessage(R.string.request_accepted_txt);
                        builder.setPositiveButton("Navigate me", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                Toast.makeText(getActivity(), "Navigating you to the needy...", Toast.LENGTH_LONG).show();
                            }
                        });
                        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                Toast.makeText(getActivity(), "The help-request has been rejected.", Toast.LENGTH_LONG).show();
                            }
                        });
                        AlertDialog dialog = builder.create();
                        dialog.show();
                    }
                });
                Button btnShare = (Button) view.findViewById(R.id.btn_share);
                    btnShare.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            // share the help-request here.
                        }
                    });
                }

                @Override
                public void onLongClick (View view,int position) {

            }
        }));

        return rootView;
    }

    public void theMainThing() {

        query = ParseQuery.getQuery("ClassName");
                query.addDescendingOrder("createdAt");
                query.whereWithinKilometers("location", myPoint, MAX_POST_SEARCH_DISTANCE);
                query.findInBackground(new FindCallback<ParseObject>() {
                    @Override
                    public void done(List<ParseObject> list, ParseException e) {

                        Toast.makeText(getContext(), "RIGHT", Toast.LENGTH_LONG).show();

                        if (e == null) {

                            Toast.makeText(getContext(), "Data fetched from parse", Toast.LENGTH_LONG).show();

                            for (int i = 0; i < list.size(); i++) {
                                String id = list.get(i).getObjectId();

                                Set<String> toKeep = new HashSet<String>();

                                toKeep.add(list.get(i).getObjectId());
                                // 4
                                Marker oldMarker = mapMarkers.get(list.get(i).getObjectId());
                                // 5
                                MarkerOptions markerOpts =
                                        new MarkerOptions().position(new LatLng(latitude, longitude));

                                ParseGeoPoint parseGeoPoint = list.get(0).getParseGeoPoint("location");

                                if (parseGeoPoint.distanceInKilometersTo(myPoint) > radius * METERS_PER_FEET
                                        / METERS_PER_KILOMETER) {
                                    if (oldMarker != null) {
                                        if (oldMarker.getSnippet() == null) {
                                            continue;
                                        } else {
                                            oldMarker.remove();
                                        }
                                    }
                                    markerOpts =
                                            markerOpts.title("Needy is far away")
                                                    .icon(BitmapDescriptorFactory.defaultMarker(
                                                            BitmapDescriptorFactory.HUE_RED));
                                } else {
                                    if (oldMarker != null) {
                                        if (oldMarker.getSnippet() != null) {
                                            continue;
                                        } else {
                                            oldMarker.remove();
                                        }
                                    }
                                    markerOpts =
                                            markerOpts.title("Needy\'s location")
                                                    .snippet("by " + posted_byS)
                                                    .icon(BitmapDescriptorFactory.defaultMarker(
                                                            BitmapDescriptorFactory.HUE_GREEN));

                                }

                                Marker marker = mapFragment.getMap().addMarker(markerOpts);
                                mapMarkers.put(list.get(i).getObjectId(), marker);
                                // 8
                                if (list.get(i).getObjectId().equals(selectedPostObjectId)) {
                                    marker.showInfoWindow();
                                    selectedPostObjectId = null;
                                }

                                cleanUpMarkers(toKeep);

                                try {
                                    ParseFile parseFile = list.get(i).getParseFile("hImage");
                                    byte[] data = parseFile.getData();
                                    bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
                                } catch (Exception err) {
                                    err.printStackTrace();
                                    android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(getContext());
                                    builder.setTitle("");
                                    builder.setMessage(err.getMessage());
                                    builder.setPositiveButton(android.R.string.ok, null);
                                    builder.show();
                                }

                                hDescriptionAcceptS = (String) list.get(i).get("hDescription");



                                currentLatAcceptS = (String) list.get(i).get("hLatitude");

                                currentLngAcceptS = (String) list.get(i).get("hLongitude");

                                post_timeS = (String) list.get(i).get("currentTime");
                                post_dateS = (String) list.get(i).get("currentDate");
                                posted_byS = (String) list.get(i).get("postedBy");

                                ListContentAAR score = new ListContentAAR(nPicTagAcceptS, bitmap, nDescriptionTagAcceptS, hDescriptionAcceptS, currentCoordinatesTagAcceptS, mapFragment, R.id.btn_accept, R.id.btn_share, post_dateS, post_timeS, "by " + posted_byS);
                                listContentAARs.add(score);

                                initializeAdapter();

                            }

                        } else {
                            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                            builder.setMessage(e.getMessage());
                            builder.setPositiveButton(android.R.string.ok, null);
                            AlertDialog dialog = builder.create();
                            dialog.show();

                            Log.d("error retrieving data", e.getMessage());
                        }
                    }
                });
    }

    private void initializeAdapter(){
        RVAdapterAAR adapter = new RVAdapterAAR(listContentAARs);
        recyclerView.setAdapter(adapter);
    }

    public void cleanUpMarkers(Set<String> markersToKeep) {
        for (String objId : new HashSet<String>(mapMarkers.keySet())) {
            if (!markersToKeep.contains(objId)) {
                Marker marker = mapMarkers.get(objId);
                marker.remove();
                mapMarkers.get(objId).remove();
                mapMarkers.remove(objId);
            }
        }
    }

    public Location getLocation() {
        // If Google Play Services is available
        if (servicesConnected()) {
            // Get the current location
            return LocationServices.FusedLocationApi.getLastLocation(locationClient);
        } else {
            return null;
        }
    }

     public void itemClicked(View view, int position) {

    }

    @Override
    public void onConnected(Bundle bundle) {

    }


    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onLocationChanged(Location location) {
        theMainThing();
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {

    }

    class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {

        private GestureDetector gestureDetector;
        private ClickListener clickListener;

        public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) {
            this.clickListener = clickListener;
            gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener(){
                @Override
                public boolean onSingleTapUp(MotionEvent e) {
                    return true;
                }

                @Override
                public void onLongPress(MotionEvent e) {
                    View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
                    if (child != null && clickListener != null) {
                        clickListener.onLongClick(child, recyclerView.getChildPosition(child));
                    }
                    super.onLongPress(e);
                }
            });
        }

        @Override
        public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
            View child = rv.findChildViewUnder(e.getX(), e.getY());
            if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
                clickListener.onClick(child, rv.getChildPosition(child));
            }
            return false;
        }

        @Override
        public void onTouchEvent(RecyclerView rv, MotionEvent e) {

        }

        @Override
        public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

        }
    }

    @Override
    public void onResume() {
        super.onResume();
        theMainThing();
    }

}


请让我知道这里出了什么问题。

抱歉,如果问题的格式不好,我仍在学习发布良好的问题。

请不要将其标记为重复项,而应给我答案!我不知道该如何解决。这不是重复的,因为我不问如何修复nullPointerException,而是问如何在fragment中提供对RecyclerView.ViewHolder的引用。

最佳答案

如何在RecyclerView.ViewHolder中提供片段的引用?


PersonViewHolder类中获取片段引用为:

1.在RVAdapterAAR类构造函数中添加Fragment参数:

Fragment mFragment;
RVAdapterAAR(List<ListContentAAR> listContentAARs,Fragment mFragment) {
    this.listContentAARs = listContentAARs;
    this.mFragment=mFragment;
 }


2.在PersonViewHolder类构造函数中添加Fragment参数:

Fragment mFragment;
PersonViewHolder(View itemView,Fragment mFragment) {
 super(itemView);
 this.mFragment=mFragment;
 ....your code here...
 mapFragment = (SupportMapFragment) mFragment.getChildFragmentManager().
               findFragmentById(R.id.map_fragment);
}


3.现在使用Fragment类中的Your_Fragment_Name.this传递Fragment引用,在其中创建RVAdapterAAR类的对象。

10-06 14:40