在打开/关闭软键盘之前,RecyclerView不会更新

时间:2018-09-24 17:59:10

标签: android android-layout android-recyclerview refresh updates

我有一个帖子供稿(类似于Facebook新闻供稿)活动,在它的布局中,我有一个 EditText ,在页面上共享了 Button 顶部和其下方的 RecyclerView 。 RecyclerView通过从服务器获取所有帖子并以+----+------+-------+------+-----------+ | id | name | start | stop | n_overlap | +----+------+-------+------+-----------+ | 1 | A | 1 | 5 | 3 | +----+------+-------+------+-----------+ | 2 | A | 2 | 6 | 3 | +----+------+-------+------+-----------+ | 3 | A | 4 | 8 | 3 | +----+------+-------+------+-----------+ | 4 | A | 9 | 10 | 1 | +----+------+-------+------+-----------+ | 5 | B | 3 | 6 | 2 | +----+------+-------+------+-----------+ | 6 | B | 4 | 8 | 2 | +----+------+-------+------+-----------+ | 7 | B | 1 | 2 | 1 | +----+------+-------+------+-----------+ 方法通过适配器绑定数据来显示所有用户的帖子。

当用户通过在EditText中键入一些文本并单击共享按钮来发布内容时,数据将发送到服务器(我正在使用Retrofit),并且在服务器成功响应后,我将调用在array.stream.sorted(strategy[0].compare().thenComparing(strategy[1].compare()).thencomparing...)中调用的相同函数显示所有帖子以更新RecyclerView的方法。

我面临的问题是数据已发布到服务器,但是只有当我在键入后按下返回按钮以隐藏/关闭键盘或通过点击EditText显示/打开键盘时,布局才会更新。 / p>

以下是一些更好理解的代码:

此处是我在用户发布内容时向服务器发送请求:

OnCreate

这里是displayFeedPosts方法:

OnCreate

PS:我是Android的新手,如果我做错了事情,我深表歉意。欢迎您提出建议。

注意:有关ListView herehere的问题相同,但不能解决我的问题

2 个答案:

答案 0 :(得分:1)

我在Arsalan Khan答案的帮助下解决了上述问题。

实际上,initRecyclerView()不在onResponse()方法之外执行。将其包含在onResponse()方法内,并使用notifyDataSetChanged()代替initRecyclerView()解决了这个问题。

两次填充数据的解决方案,我通过以下方式修改displayFeedPosts()来解决它:

private void updateFeedPosts() {
        Call<FeedPosts> call = mAPIService.displayFeedPosts(apiKey);
        call.enqueue(new Callback<FeedPosts>() {
            @Override
            public void onResponse(@NonNull Call<FeedPosts> call, @NonNull Response<FeedPosts> response) {
                boolean error = response.body().getError();
                if (!error) {
                    mTripFeedPostProfileImages.clear();
                    mTripFeedPostUserNames.clear();
                    mTripFeedPostTime.clear();
                    mTripFeedPostContent.clear();
                    mTripFeedPostImages.clear();
                    mTripFeedPostID.clear();
                    mTripFeedPostRecyclerViewAdapter.notifyDataSetChanged();
                    ArrayList<Post> feedPosts = response.body().getPosts();
                    for (Post post : feedPosts) {
                        mTripFeedPostProfileImages.add(post.getProfilePicture());
                        mTripFeedPostUserNames.add(post.getFirstName() + " " + post.getLastName());
                        mTripFeedPostTime.add(post.getPostDatetime());
                        mTripFeedPostContent.add(post.getPostDescription());
                        mTripFeedPostImages.add(post.getPostImagePath());
                        mTripFeedPostID.add(post.getPostTripfeedId());
                    }
                    mTripFeedPostRecyclerViewAdapter.notifyDataSetChanged();
                }
            }

            @Override
            public void onFailure(@NonNull Call<FeedPosts> call, @NonNull Throwable t) {
                Log.d(TAG, "Error: " + t.getMessage());
            }
        });
    }

我清除了适配器数据,然后再次使用更新的数据填充它。 希望我的回答对遇到同样问题的人有所帮助。

PS:我知道我没有以正确的方式使用我的适配器模型,我只能对所有值使用一个ArrayList,我稍后将对其进行修改专注于主要功能。

答案 1 :(得分:0)

应在此处调用initRecyclerView:

private void displayFeedPosts() {
        Call<FeedPosts> call = mAPIService.displayFeedPosts(apiKey);
        call.enqueue(new Callback<FeedPosts>() {
            @Override
            public void onResponse(@NonNull Call<FeedPosts> call, @NonNull Response<FeedPosts> response) {
                boolean error = response.body().getError();
                if (!error) {
                    ArrayList<Post> feedPosts = response.body().getPosts();
                    for (Post post : feedPosts) {
                        mTripFeedPostUserNames.add(post.getFirstName() + " " + post.getLastName());
                        mTripFeedPostTime.add(post.getPostDatetime());
                        mTripFeedPostContent.add(post.getPostDescription());
                    }
               initRecyclerView();
                }
            }

            @Override
            public void onFailure(@NonNull Call<FeedPosts> call, @NonNull Throwable t) {
                Log.d(TAG, "Error: " + t.getMessage());
            }
        });
    }

private void initRecyclerView() {
        LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, true);
        RecyclerView recyclerView = findViewById(R.id.trip_feed_recycler_view);
        recyclerView.setNestedScrollingEnabled(false);
        recyclerView.setLayoutManager(layoutManager);
        mTripFeedPostRecyclerViewAdapter = new TripFeedPostRecyclerViewAdapter(this, mTripFeedPostProfileImages, mTripFeedPostUserNames, mTripFeedPostTime, mTripFeedPostContent, mTripFeedPostImages, mTripFeedPostID);
        recyclerView.setAdapter(mTripFeedPostRecyclerViewAdapter);
        mTripFeedPostRecyclerViewAdapter.notifyDataSetChanged();
    }