我正在通过创建一个简单的应用程序来发送和接收来自nodejs服务器的推文,以便与RecyclerView一起练习。在主要Activity中,我只列出响应,在第二个活动中,我向服务器发送一条简单的推文。我在主Activity中有一个RecyclerView,它的工作是将收到的数据显示为列表。我做配置 RecyclerView
象下面这样:RecyclerView上的notifyDataSetChanged方法
//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;
}
在第二个活动,我有发送的tweet的菜单:
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();
不起作用? 你的建议是什么?
问:你的新的鸣叫将数据库服务器?或者它是否添加到现有模型? 如果您将其添加到现有模型,通知数据集更改就足够了。但是,如果你将它发送给服务器,那么你不会得到它。由于连接未打开。 –
@aa_oo它只是保存在简单的json文件中。我的服务器是本地的。并通知数据集更改不起作用! –
对不起,我正忙着工作。 –