2017-03-05 62 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再次显示在列表中,我必须重新启动我的应用程序。 –

相关问题