我有一个帖子供稿(类似于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的新手,如果我做错了事情,我深表歉意。欢迎您提出建议。
答案 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();
}