mOnGridImageSelectedListener 错误,检索数据和图片但崩溃



我在这个错误上度过了糟糕的半周,试图将我的图像从网格视图获取到另一个带有喜欢和评论列表的片段,因此错误始终指向这一行 204 .. 做了一个日志,它成功地获得了所有数据,但它不起作用

public class ProfileFragment extends Fragment {
private static final String TAG = "ProfileFragment";

public interface OnGridImageSelectedListener{
void onGridImageSelected(Photo photo);
}
OnGridImageSelectedListener mOnGridImageSelectedListener;
private CircleImageView mProfilePhoto;
private GridView gridView;



@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.profile_fargment, container, false);
mDisplayName = (TextView) view.findViewById(R.id.display_name);
mUsername = (TextView) view.findViewById(R.id.username);
mWebsite = (TextView) view.findViewById(R.id.website);
mDescription = (TextView) view.findViewById(R.id.description);
mProfilePhoto = (CircleImageView) view.findViewById(R.id.profile_photo);
mPosts = (TextView) view.findViewById(R.id.tvPosts);
mFriends = (TextView) view.findViewById(R.id.tvFollowing);
mProgressBar = (ProgressBar) view.findViewById(R.id.profileProgressBar);
gridView = (GridView) view.findViewById(R.id.gridView1);
toolbar = (Toolbar) view.findViewById(R.id.profileToolBar);
//  profileMenu = (ImageView) view.findViewById(R.id.profileMenu);
bottomNavigationView = (BottomNavigationViewEx) view.findViewById(R.id.bottomNavViewBar);
mContext = getActivity();
mFirebaseMethods = new FirebaseMethods(getActivity());
Log.d(TAG, "onCreateView: stared.");
//  setupBottomNavigationView();
//        setupToolbar();
setupFirebaseAuth();
setupGridView();

@Override
public void onAttach(Context context) {
try{
mOnGridImageSelectedListener = (OnGridImageSelectedListener) getActivity();
}catch (ClassCastException e){
Log.e(TAG, "onAttach: ClassCastException: " + e.getMessage() );
}
super.onAttach(context);
}
private void setupGridView(){
Log.d(TAG, "setupGridView: Setting up image grid.");
final ArrayList<Photo> photos = new ArrayList<>();
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
Query query = reference
.child(getString(R.string.dbname_user_photos))
.child(FirebaseAuth.getInstance().getCurrentUser().getUid());
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
Photo photo = new Photo();
Map<String, Object> objectMap = (HashMap<String, Object>) singleSnapshot.getValue();
photo.setCaption(objectMap.get(getString(R.string.field_caption)).toString());
photo.setTags(objectMap.get(getString(R.string.field_tags)).toString());
photo.setPhoto_id(objectMap.get(getString(R.string.field_photo_id)).toString());
photo.setUser_id(objectMap.get(getString(R.string.field_user_id)).toString());
photo.setDate_created(objectMap.get(getString(R.string.field_date_created)).toString());
photo.setImage_path(objectMap.get(getString(R.string.field_image_path)).toString());
List<Like> likesList = new ArrayList<Like>();
for (DataSnapshot dSnapshot : singleSnapshot
.child(getString(R.string.field_likes)).getChildren()) {
Like like = new Like();
like.setUser_id(dSnapshot.getValue(Like.class).getUser_id());
likesList.add(like);
}
photo.setLikes(likesList);
photos.add(photo);
}
//setup our image grid
int gridWidth = getResources().getDisplayMetrics().widthPixels;
int imageWidth = gridWidth / NUM_GRID_COLUMNS;
gridView.setColumnWidth(imageWidth);
ArrayList<String> imgUrls = new ArrayList<>();
for (int i = 0; i < photos.size(); i++) {
imgUrls.add(photos.get(i).getImage_path());
}
final GridImageAdapter adapter = new GridImageAdapter(getActivity(), R.layout.layout_grid_imageview,
"", imgUrls);
gridView.setAdapter(adapter);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(@Nullable AdapterView<?> parent, View view, int position, long id) {

//this works
Log.d(TAG, "onItemClick: position is at " + photos.get(position));

//this is line 204 that dont work
mOnGridImageSelectedListener.onGridImageSelected(photos.get(position));



}
});
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(TAG, "onCancelled: query cancelled.");
}
});
}

这是视图帖子布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:id="@+id/relLayout1">
<de.hdodenhof.circleimageview.CircleImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:id="@+id/profile_photo"
android:layout_marginTop="20dp"
app:civ_border_color="@color/black"
app:civ_border_width="0.5dp"
android:layout_marginLeft="25dp"
android:layout_centerVertical="true"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="mitch.tabian"
android:layout_toRightOf="@+id/profile_photo"
android:layout_marginLeft="10dp"
android:layout_centerVertical="true"
android:id="@+id/username"
android:textColor="@color/black"
/>

<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@drawable/ic_post_settings"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"
android:layout_marginRight="20dp"
android:id="@+id/ivEllipses"/>
</RelativeLayout>
<com.nuc.zack.garmd.Utils.SqaureImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/post_image"
android:layout_below="@id/relLayout1"
android:scaleType="centerCrop"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:id="@+id/relLayout2"
android:layout_below="@+id/post_image"
android:background="@color/white">
<RelativeLayout
android:layout_width="60dp"
android:layout_height="match_parent"
android:id="@+id/heartLayout"
android:background="@color/white">
<ImageView
android:layout_width="35dp"
android:layout_height="35dp"
android:id="@+id/image_heart_red"
android:layout_centerInParent="true"
android:layout_marginLeft="20dp"
android:src="@drawable/ic_heart_red"
android:visibility="invisible"/>
<ImageView
android:layout_width="35dp"
android:layout_height="35dp"
android:id="@+id/image_heart"
android:layout_centerInParent="true"
android:layout_marginLeft="20dp"
android:src="@drawable/ic_heart_white"
android:visibility="visible"/>
</RelativeLayout>
<ImageView
android:layout_width="35dp"
android:layout_height="35dp"
android:id="@+id/speech_bubble"
android:layout_toRightOf="@+id/heartLayout"
android:layout_marginLeft="10dp"
android:src="@drawable/ic_speech_bubble"
android:visibility="visible"
android:layout_centerVertical="true"/>
<ImageView
android:layout_width="35dp"
android:layout_height="35dp"
android:id="@+id/imageShare"
android:layout_toRightOf="@+id/speech_bubble"
android:layout_marginLeft="10dp"
android:src="@drawable/ic_share_post"
android:visibility="visible"
android:layout_centerVertical="true"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/relLayout3"
android:layout_below="@+id/relLayout2"
android:padding="20dp"
android:layout_marginBottom="50dp"
android:background="@color/white">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Liked by Mitch, Tom, Mohammed and 30 others"
android:textColor="@color/black"
android:textSize="18sp"
android:id="@+id/likes"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="mitch.tabian moutains #earthporn #mountains"
android:textColor="@color/black"
android:textSize="18sp"
android:id="@+id/caption"
android:layout_below="@+id/likes"
android:layout_marginTop="15dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="View all 3 comments"
android:textColor="@color/grey"
android:textSize="18sp"
android:layout_below="@+id/caption"
android:id="@+id/comments"
android:layout_marginTop="15dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="3 DAYS AGO"
android:textColor="@color/grey"
android:textSize="18sp"
android:layout_below="@+id/comments"
android:id="@+id/image_time_posted"
android:layout_marginTop="15dp"/>
</RelativeLayout>
</RelativeLayout>
</ScrollView>
<include layout="@layout/layout_bottom_navigation_view"/>
</RelativeLayout>

维韦波斯特片段

public class ViewPostFragment extends Fragment {
private static final String TAG = "ViewPostFragment";
public ViewPostFragment(){
super();
setArguments(new Bundle());
}
//widgets
private SqaureImageView mPostImage;
private BottomNavigationViewEx bottomNavigationView;
private TextView mBackLabel, mCaption, mUsername, mTimestamp, mLikes;
private ImageView mBackArrow, mEllipses, mHeartRed, mHeartWhite, mProfileImage;

//vars
private Photo mPhoto;
private int mActivityNumber = 0;
private String photoUsername = "";
private String profilePhotoUrl = "";
private UserAccount mUserAccountSettings;
private GestureDetector mGestureDetector;
private Heart mHeart;
private Boolean mLikedByCurrentUser;
private StringBuilder mUsers;
private String mLikesString = "";
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_view_post, container, false);
mPostImage = (SqaureImageView) view.findViewById(R.id.post_image);
bottomNavigationView = (BottomNavigationViewEx) view.findViewById(R.id.bottomNavViewBar);
mBackArrow = (ImageView) view.findViewById(R.id.backArrow);
mBackLabel = (TextView) view.findViewById(R.id.tvBackLabel);
mCaption = (TextView) view.findViewById(R.id.caption);
mUsername = (TextView) view.findViewById(R.id.username);
mTimestamp = (TextView) view.findViewById(R.id.image_time_posted);
mEllipses = (ImageView) view.findViewById(R.id.ivEllipses);
mHeartRed = (ImageView) view.findViewById(R.id.image_heart_red);
mHeartWhite = (ImageView) view.findViewById(R.id.image_heart);
mProfileImage = (ImageView) view.findViewById(R.id.profile_photo);
mLikes = (TextView) view.findViewById(R.id.likes);

mHeart = new Heart(mHeartWhite, mHeartRed);
mGestureDetector = new GestureDetector(getActivity(), new GestureListener());
try{
mPhoto = getPhotoFromBundle();
UniversalImageLoader.setImage(mPhoto.getImage_path(), mPostImage, null, "");
mActivityNumber = getActivityNumFromBundle();
getPhotoDetails();
getLikesString();
}catch (NullPointerException e){
Log.e(TAG, "onCreateView: NullPointerException: " + e.getMessage() );
}
setupFirebaseAuth();
setupBottomNavigationView();

return view;
}

private void getLikesString(){
Log.d(TAG, "getLikesString: getting likes string");
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
Query query = reference
.child(getString(R.string.dbname_photos))
.child(mPhoto.getPhoto_id())
.child(getString(R.string.field_likes));
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
mUsers = new StringBuilder();
for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
Query query = reference
.child(getString(R.string.dbname_user))
.orderByChild(getString(R.string.field_user_id))
.equalTo(singleSnapshot.getValue(Like.class).getUser_id());
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
Log.d(TAG, "onDataChange: found like: " +
singleSnapshot.getValue(User.class).getUser_name());
mUsers.append(singleSnapshot.getValue(User.class).getUser_name());
mUsers.append(",");
}
String[] splitUsers = mUsers.toString().split(",");
if(mUsers.toString().contains(mUserAccountSettings.getUser_name())){
mLikedByCurrentUser = true;
}else{
mLikedByCurrentUser = false;
}
int length = splitUsers.length;
if(length == 1){
mLikesString = "Liked by " + splitUsers[0];
}
else if(length == 2){
mLikesString = "Liked by " + splitUsers[0]
+ " and " + splitUsers[1];
}
else if(length == 3){
mLikesString = "Liked by " + splitUsers[0]
+ ", " + splitUsers[1]
+ " and " + splitUsers[2];
}
else if(length == 4){
mLikesString = "Liked by " + splitUsers[0]
+ ", " + splitUsers[1]
+ ", " + splitUsers[2]
+ " and " + splitUsers[3];
}
else if(length > 4){
mLikesString = "Liked by " + splitUsers[0]
+ ", " + splitUsers[1]
+ ", " + splitUsers[2]
+ " and " + (splitUsers.length - 3) + " others";
}
Log.d(TAG, "onDataChange: likes string: " + mLikesString);
setupWidgets();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
if(!dataSnapshot.exists()){
mLikesString = "";
mLikedByCurrentUser = false;
setupWidgets();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
public class GestureListener extends GestureDetector.SimpleOnGestureListener{
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
Log.d(TAG, "onDoubleTap: double tap detected.");
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
Query query = reference
.child(getString(R.string.dbname_photos))
.child(mPhoto.getPhoto_id())
.child(getString(R.string.field_likes));
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
String keyID = singleSnapshot.getKey();
//case1: Then user already liked the photo
if(mLikedByCurrentUser &&
singleSnapshot.getValue(Like.class).getUser_id()
.equals(FirebaseAuth.getInstance().getCurrentUser().getUid())){
myRef.child(getString(R.string.dbname_photos))
.child(mPhoto.getPhoto_id())
.child(getString(R.string.field_likes))
.child(keyID)
.removeValue();
///
myRef.child(getString(R.string.dbname_user_photos))
.child(FirebaseAuth.getInstance().getCurrentUser().getUid())
.child(mPhoto.getPhoto_id())
.child(getString(R.string.field_likes))
.child(keyID)
.removeValue();
mHeart.toggleLike();
getLikesString();
}
//case2: The user has not liked the photo
else if(!mLikedByCurrentUser){
//add new like
addNewLike();
break;
}
}
if(!dataSnapshot.exists()){
//add new like
addNewLike();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return true;
}
}
private void addNewLike(){
Log.d(TAG, "addNewLike: adding new like");
String newLikeID = myRef.push().getKey();
Like like = new Like();
like.setUser_id(FirebaseAuth.getInstance().getCurrentUser().getUid());
myRef.child(getString(R.string.dbname_photos))
.child(mPhoto.getPhoto_id())
.child(getString(R.string.field_likes))
.child(newLikeID)
.setValue(like);
myRef.child(getString(R.string.dbname_user_photos))
.child(FirebaseAuth.getInstance().getCurrentUser().getUid())
.child(mPhoto.getPhoto_id())
.child(getString(R.string.field_likes))
.child(newLikeID)
.setValue(like);
mHeart.toggleLike();
getLikesString();
}
private void getPhotoDetails(){
Log.d(TAG, "getPhotoDetails: retrieving photo details.");
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
Query query = reference
.child(getString(R.string.dbname_user_account))
.orderByChild(getString(R.string.field_user_id))
.equalTo(mPhoto.getUser_id());
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for ( DataSnapshot singleSnapshot :  dataSnapshot.getChildren()){
mUserAccountSettings = singleSnapshot.getValue(UserAccount.class);
}
//setupWidgets();
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(TAG, "onCancelled: query cancelled.");
}
});
}
private void setupWidgets(){
String timestampDiff = getTimestampDifference();
if(!timestampDiff.equals("0")){
mTimestamp.setText(timestampDiff + " DAYS AGO");
}else{
mTimestamp.setText("TODAY");
}
UniversalImageLoader.setImage(mUserAccountSettings.getProfile_photo(), mProfileImage, null, "");
mUsername.setText(mUserAccountSettings.getProfile_photo());
mLikes.setText(mLikesString);
if(mLikedByCurrentUser){
mHeartWhite.setVisibility(View.GONE);
mHeartRed.setVisibility(View.VISIBLE);
mHeartRed.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.d(TAG, "onTouch: red heart touch detected.");
return mGestureDetector.onTouchEvent(event);
}
});
}
else{
mHeartWhite.setVisibility(View.VISIBLE);
mHeartRed.setVisibility(View.GONE);
mHeartWhite.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.d(TAG, "onTouch: white heart touch detected.");
return mGestureDetector.onTouchEvent(event);
}
});
}

}

/**
* Returns a string representing the number of days ago the post was made
* @return
*/
private String getTimestampDifference(){
Log.d(TAG, "getTimestampDifference: getting timestamp difference.");
String difference = "";
Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.CANADA);
sdf.setTimeZone(TimeZone.getTimeZone("Canada/Pacific"));//google 'android list of timezones'
Date today = c.getTime();
sdf.format(today);
Date timestamp;
final String photoTimestamp = mPhoto.getDate_created();
try{
timestamp = sdf.parse(photoTimestamp);
difference = String.valueOf(Math.round(((today.getTime() - timestamp.getTime()) / 1000 / 60 / 60 / 24 )));
}catch (ParseException e){
Log.e(TAG, "getTimestampDifference: ParseException: " + e.getMessage() );
difference = "0";
}
return difference;
}
/**
* retrieve the activity number from the incoming bundle from profileActivity interface
* @return
*/
private int getActivityNumFromBundle(){
Log.d(TAG, "getActivityNumFromBundle: arguments: " + getArguments());
Bundle bundle = this.getArguments();
if(bundle != null) {
return bundle.getInt(getString(R.string.activity_number));
}else{
return 0;
}
}
/**
* retrieve the photo from the incoming bundle from profileActivity interface
* @return
*/
private Photo getPhotoFromBundle(){
Log.d(TAG, "getPhotoFromBundle: arguments: " + getArguments());
Bundle bundle = this.getArguments();
if(bundle != null) {
return bundle.getParcelable(getString(R.string.photo));
}else{
return null;
}
}
/**
* BottomNavigationView setup
*/
private void setupBottomNavigationView(){
Log.d(TAG, "setupBottomNavigationView: setting up BottomNavigationView");
BottomNavigationViewHelper.setupBottomNavigationView(bottomNavigationView);
BottomNavigationViewHelper.enableNavigation(getActivity(),getActivity() ,bottomNavigationView);
Menu menu = bottomNavigationView.getMenu();
MenuItem menuItem = menu.getItem(mActivityNumber);
menuItem.setChecked(true);
}
}

日志猫

10-04 19:10:55.563 3171-3171/com.sdad.fd E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.NullPointerException
at com.sdad.fd.Profile.ProfileFragment$2$1.onItemClick(ProfileFragment.java:207)
at android.widget.AdapterView.performItemClick(AdapterView.java:298)
at android.widget.AbsListView.performItemClick(AbsListView.java:1100)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:2788)
at android.widget.AbsListView$1.run(AbsListView.java:3463)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)

提前致谢

附言 在每个文档中查找错误并尝试切换到意图并不成功

将接口从片段类中取出到它自己的类中,在片段中实现它,在片段中实现onGridImageSelected((,然后从onItemClick((调用它。

最新更新