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()