我想通过创建简单的应用来发送和接收来自nodejs服务器的推文来使用RecyclerView进行练习。在主Activity中,我只列出了响应,在第二个活动中,我向服务器发送了一条简单的推文。我在我的主Activity中有一个RecyclerView,它的工作是将收到的数据显示为列表。我配置
RecyclerView
如下所示:
//config recycler view
mRyTweets = (RecyclerView) findViewById(R.id.ry_tweets);
mRyTweets.setLayoutManager(new LinearLayoutManager(this));
mAdapter = new TweetAdapter(this, new TweetAdapter.TweetEventHandler() {
@Override
public void onEditTweet(String tweetId, int position) {
}
@Override
public void onDeleteTweet(String tweetId, int position) {
}
});
mRyTweets.setAdapter(mAdapter);
及其布局:
<android.support.v7.widget.Toolbar
android:id="@+id/default_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
android:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
<android.support.v7.widget.RecyclerView
android:id="@+id/ry_tweets"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/default_toolbar"/>
</RelativeLayout>
这是我从简单的nodejs服务器收到响应的地方:
private void getTweetsFromServer() {
Call<List<TweetModel>> call = mTService.getTweets();
call.enqueue(new Callback<List<TweetModel>>() {
@Override
public void onResponse(Call<List<TweetModel>> call, Response<List<TweetModel>> response) {
if (response.isSuccessful()) {
//update the adapter data
mAdapter.updateAdapterData(response.body());
mAdapter.notifyDataSetChanged();
} else {
ErrorModel errorModel = ErrorUtils.parseError(response);
Toast.makeText(getBaseContext(), "Error Type is: " + errorModel.type + " , description "
+ errorModel.description, Toast.LENGTH_SHORT).show();
}
}
在此行中mAdapter.updateAdapterData(response.body());
我将服务器的响应添加到适配器:
public class TweetAdapter extends RecyclerView.Adapter<TweetAdapter.TweetViewHolder> {
private Context mContext;
private LayoutInflater mLayoutInflater;
private List<TweetModel> mData = Collections.emptyList();
private TweetEventHandler mTweetEventHandler;
public TweetAdapter(Context context, TweetEventHandler tweetEventHandler) {
this.mContext = context;
this.mLayoutInflater = LayoutInflater.from(context);
this.mTweetEventHandler = tweetEventHandler;
}
public void updateAdapterData(List<TweetModel> data) {
this.mData = data;
}
在第二个活动中我有一个发送推文的菜单:
TweetModel tweetModel = new TweetModel();
//assign tweet model values
tweetModel.body = mETxTweetBody.getText().toString();
tweetModel.feel = mSelectedMode;
//create call generic class to send request to server
Call<TweetModel> call = mTService.createNewTweet(tweetModel);
//Async request
//NOTE: you should always Async request since the sync request cause the crash of your app
call.enqueue(new Callback<TweetModel>() {
@Override
public void onResponse(Call<TweetModel> call, Response<TweetModel> response) {
if (response.isSuccessful()) {
//
Toast.makeText(getApplicationContext(), "Successfully post tweet" + response.body().created_at
, Toast.LENGTH_SHORT).show();
finish();
}
一切都很好,但是当我在主要活动中发送新推文时,新推文不会立即显示在我的列表中,我必须退出应用并再次运行。我不知道为什么mAdapter.notifyDataSetChanged();
不起作用?
你的建议是什么?
答案 0 :(得分:1)
感谢大家。 我通过
解决了我的问题startActivityForResult(postNewTweetIntent,Constants.CREATE_OR_EDIT_TWEET_REQUEST_CODE);
当我发送推文时,在MainActivity中{p>和setResult(RESULT_OK);
。然后在活动中:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == Constants.CREATE_OR_EDIT_TWEET_REQUEST_CODE &&
resultCode == RESULT_OK) {
getTweetsFromServer();
}
super.onActivityResult(requestCode, resultCode, data);
}
在此方法中getTweetsFromServer();
我收到服务器的回复,然后拨打notifyDataSetChanged()
来更新我的列表:
mAdapter.updateAdapterData(response.body());
mAdapter.notifyDataSetChanged();
答案 1 :(得分:0)
首先,Collections.emptyList();
返回一个不可变列表。请参阅this。
使用:
List<Model> mData = new ArrayList<>();
然后你为什么不试试update
:
public void updateAdapterData(List<TweetModel> data) {
// instead of this this.mData = data;
this.mData.addAll(data);
notifyDataSetChanged();
}
它应该工作正常!如果你需要解释,请回复!