RecyclerView上的notifyDataSetChanged方法

时间:2017-03-05 13:08:53

标签: android node.js android-recyclerview

我想通过创建简单的应用来发送和接收来自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();不起作用? 你的建议是什么?

2 个答案:

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

它应该工作正常!如果你需要解释,请回复!