RecyclerView не обновляется, пока Soft Keyboard не будет открыта / закрыта - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть Лента сообщений (что-то похожее на ленту новостей Facebook), и в его макете у меня есть EditText , доля Button вверху и RecyclerView под ним.RecyclerView показывает сообщения всех пользователей, получая все сообщения с сервера и связывая данные через адаптер в методе OnCreate.

Когда пользователь публикует что-либо, набрав текст в EditText и нажав кнопку «Поделиться», данныеотправляется на сервер (я использую Retrofit), и после успешного ответа с сервера я вызываю ту же функцию, которая вызывает в OnCreate метод для отображения всех сообщений для обновления RecyclerView.

Проблема, с которой я сталкиваюсь, заключается в том, чтоданные отправляются на сервер, но раскладка обновляется только тогда, когда я нажимаю кнопку «Назад», чтобы скрыть / закрыть клавиатуру после ввода, или показать / открыть клавиатуру, коснувшись EditText.

Ниже приведены некоторые изКод для лучшего понимания:

Здесь я отправляю запрос на сервер, когда пользователь что-то публикует:

Call<CreatePost> call = mAPIService.sharePost(apiKey, post_description);
        call.enqueue(new Callback<CreatePost>() {
            @Override
            public void onResponse(@NonNull Call<CreatePost> call, @NonNull Response<CreatePost> response) {
                boolean error = response.body().getError();
                if (!error) {
                    displayFeedPosts();
                }
            }

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

Вот метод displayFeedPosts:

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

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

        initRecyclerView();
    }

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

PS: Я новичок в Android, прошу прощения, если я поступил неправильно.Ваши предложения приветствуются.

Примечание: тот же вопрос был задан в отношении ListView здесь и здесь , но это не решило мою проблему

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Я решил вышеупомянутую проблему с помощью Арсалана Хана Ответ.

На самом деле 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 для всехзначения, я изменю это позже прямо сейчас, я сосредотачиваюсь на основных функциях.

0 голосов
/ 25 сентября 2018

должен вызвать 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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...