1

我有更新RecyclerView数据的问题,我想notifyDataSetChanged()有什么问题,但我不知道是什么。 RecyclerView一旦创建就空了,没有任何变化。RecyclerView不更新数据

这里是我的代码:

EditFriends2 (once i have it working i erase the "2" ;)) 

public class EditFriendsActivty2 extends AppCompatActivity { 

private static final String TAG = EditFriendsActivty2.class.getSimpleName(); 
private ParseUser mCurrentUser; 
private ParseRelation<ParseUser> mFriendsRelation; 
private List<ParseUser> mFriends; 
private List<ParseUser> mUsers; 
private FriendsAdapter adapter; 

private RecyclerView mRecyclerView; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_edit_friends_activty2); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView); 

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
     } 
    }); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    adapter = new FriendsAdapter(mUsers, mFriends); 

    mRecyclerView.setAdapter(adapter); 

    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(EditFriendsActivty2.this); 
    mRecyclerView.setLayoutManager(layoutManager); 

    mRecyclerView.setHasFixedSize(true); 

    showFriendsList(); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    showFriendsList(); 
} 

private void showFriendsList() { 
    mCurrentUser = ParseUser.getCurrentUser(); 
    mFriendsRelation = mCurrentUser.getRelation(ParseConstants.KEY_FRIENDS_RELATION); 

    ParseQuery<ParseUser> query = ParseUser.getQuery(); 
    query.orderByAscending(ParseConstants.KEY_USERNAME); 
    query.setLimit(1000); 
    query.findInBackground(new FindCallback<ParseUser>() { 
     @Override 
     public void done(List<ParseUser> list, ParseException e) { 
      if (e == null) { 
       // Success 
       mUsers = list; 
       downloadFriends(); 
      } else { 
       Toast.makeText(EditFriendsActivty2.this, R.string.error_toast, Toast.LENGTH_SHORT).show(); 
       Log.i(TAG, e.getMessage()); 
      } 
     } 
    }); 
} 

private void downloadFriends() { 
    mFriendsRelation.getQuery().findInBackground(new FindCallback<ParseUser>() { 
     @Override 
     public void done(List<ParseUser> list, ParseException e) { 
      if (e == null) { 
       mFriends = list; 

       // Here i'm updating the RecyclerView, when i have the data about users and friends 

       adapter.notifyDataSetChanged(); 
      } else { 
       Log.i(TAG, e.getMessage()); 
      } 
     } 
    }); 
} 
} 

我的适配器:

public class FriendsAdapter extends RecyclerView.Adapter<FriendsAdapter.FriendsViewHolder> { 

private static final String TAG = FriendsAdapter.class.getSimpleName(); 

private List<ParseUser> mUsers; 
private List<ParseUser> mFriends; 


public FriendsAdapter(List<ParseUser> users, List<ParseUser> friends){ 
    mUsers = users; 
    mFriends = friends; 
} 


@Override 
public FriendsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()).inflate((R.layout.friends_list_item), parent, false); 
    FriendsViewHolder viewHolder = new FriendsViewHolder(view); 
    return viewHolder; 
} 

@Override 
public void onBindViewHolder(FriendsViewHolder holder, int position) { 
    if(mUsers != null) { 
     holder.bindFriends(mUsers.get(position)); 
    } 
} 

@Override 
public int getItemCount() { 
    return 0; 
} 

public class FriendsViewHolder extends RecyclerView.ViewHolder { 

    public TextView mNameLabel; 
    public CheckBox mCheckBox; 

    public FriendsViewHolder(View itemView) { 
     super(itemView); 

     mNameLabel = (TextView) itemView.findViewById(R.id.nameLabel); 
     mCheckBox = (CheckBox) itemView.findViewById(R.id.checkBox); 
    } 

    public void bindFriends (ParseUser user){ 
     mNameLabel.setText(user.getUsername()); 
     mCheckBox.setChecked(false); 

     for (ParseUser friend : mFriends){ 
       if(friend.getObjectId().equals(user.getObjectId())){ 
        mCheckBox.setChecked(true); 
        break; 
       } 
     } 
    } 
} 

} 

谁能帮我解决这个问题?多谢!

+0

这里有两个问题。它始终为空的原因是因为您已将getItemCount()设置为返回0.不会更新的原因是因为您正在更改活动内部的朋友列表,而不是在适配器内部。看到我的答案为每个解决方案。 – AdamMc331

+0

如果它最终帮助你,请不要忘记接受答案,@ Yogurt33 – d0nut

回答

1

问题是,你从来没有真正改变适配器的列表。看这句话的Activity类中:

mFriendsRelation.getQuery().findInBackground(new FindCallback<ParseUser>() { 
    @Override 
    public void done(List<ParseUser> list, ParseException e) { 
     if (e == null) { 
      mFriends = list; 

      // Here i'm updating the RecyclerView, when i have the data about users and friends 

      adapter.notifyDataSetChanged(); 
     } else { 
      Log.i(TAG, e.getMessage()); 
     } 
    } 
}); 

mFriends对象,要设置为活动中的变量,它是不一样的适配器内部的一个。我建议在您的适配器添加这样的方法:

public void swapFriends(List<ParseUser> friends) { 
    mFriends = friends; 
    notifyDataSetChanged(); 
} 

然后就可以调用它的findInBackground()方法内是这样的:

mFriendsRelation.getQuery().findInBackground(new FindCallback<ParseUser>() { 
    @Override 
    public void done(List<ParseUser> list, ParseException e) { 
     if (e == null) { 
      adapter.swapFriends(list); 
     } else { 
      Log.i(TAG, e.getMessage()); 
     } 
    } 
}); 

编辑:另一个问题可能出在你getItemCount()方法。你总是返回0.你需要返回你想要显示的朋友的数量。将其更改为:

@Override 
public int getItemCount() { 
    return mFriends.size(); 
} 
+1

谢谢!我完全错过了getItemCount()方法。现在它完美地工作 – Yogurt33

1

最初在创建FriendsAdapter时,您的mFriendsmUsers列表是null

当您收到数据响应时,将用新引用替换当前的mUsersmFriends列表。而RecyclerView将继续指向旧列表。

解决方案1:

确保mFriendsmUsersnull开始。

然后,您可以执行mFriends.addAll(newFriends)mUsers.addAll(newUsers)添加收到的新朋友和用户。然后执行adapter.notifyDataSetChanged()

解决方案2:

添加的方法在你FriendsAdapter告诉你有一个新的列表adapter.showNewFriends(mFriends)的RecyclerView。如果您需要这些参数作为另一个参数或其他方法在您首先获取它们时调用,请添加用户。在此适配器方法中,您可以拨打notifyDataSetChanged()