我正在通過創建一個簡單的應用程序來發送和接收來自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文件中。我的服務器是本地的。並通知數據集更改不起作用! –
對不起,我正忙着工作。 –