2017-03-05 70 views
0

我正在通過創建一個簡單的應用程序來發送和接收來自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();不起作用? 你的建議是什麼?

+0

問:你的新的鳴叫將數據庫服務器?或者它是否添加到現有模型? 如果您將其添加到現有模型,通知數據集更改就足夠了。但是,如果你將它發送給服務器,那麼你不會得到它。由於連接未打開。 –

+0

@aa_oo它只是保存在簡單的json文件中。我的服務器是本地的。並通知數據集更改不起作用! –

+0

對不起,我正忙着工作。 –

回答

1

感謝大家。 我通過

startActivityForResult(postNewTweetIntent,Constants.CREATE_OR_EDIT_TWEET_REQUEST_CODE); 

在MainActivity和setResult(RESULT_OK);固定我的問題,當我發送的tweet。然後在活動:

@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(); 
+0

偉大的startactivityforresult工作!乾杯! – MadScientist

+0

@MadScientist感謝您的幫助。 –

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

它應該只是正常工作!如果您需要解釋,請回復!

+0

我做你的建議,但我得到這個錯誤:[錯誤](http://pastebin.com/BXwbxtiS) –

+0

是的,我的壞,忘記你使用'Collections.emptyList();'返回一個不可變列表。 使用'mData = new ArrayList();' Ref:[Check this stack post](http://stackoverflow.com/questions/5552258/collections-emptylist-vs-new-instance) – MadScientist

+0

data it does not再次顯示在列表中,我必須重新啓動我的應用程序。 –

相關問題