android - 回收站视图未在 Fragment (Android) 上显示项目
问题描述
我试图让我的 RecyclerView 在从服务器收到它后显示“消息室”项目。
目前,RecyclerView 位于连接到 BottomNavigationView 的 Fragment 上。
我使用“MessageRoomAdapter”从服务器响应中设置信息,但不知何故,在成功通信后,我的 RecyclerView 只显示空(白色)屏幕。
它与生命周期问题有关吗?
我用谷歌搜索了几个小时,但找不到答案。
MessageRoomAdapter.java
public class MessageRoomAdapter extends RecyclerView.Adapter<MessageRoomAdapter.CustomViewHolder> {
private ArrayList<MessageRoomItem> message_room_item_list;
private OnItemClickListener mListener = null;
public MessageRoomAdapter(ArrayList<MessageRoomItem> message_room_item_list) {
this.message_room_item_list = message_room_item_list;
}
public interface OnItemClickListener {
void onItemClick(View v, int position);
}
@NonNull
@Override
public MessageRoomAdapter.CustomViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_message_room, parent, false);
CustomViewHolder holder = new CustomViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull MessageRoomAdapter.CustomViewHolder holder, int position) {
holder.tv_item_message_room_idx.setText(Integer.toString(message_room_item_list.get(position).getMessage_room_idx()));
holder.tv_item_message_user_idx.setText(Integer.toString(message_room_item_list.get(position).getUser_idx()));
holder.tv_item_message_user_nickname.setText(message_room_item_list.get(position).getUser_nickname());
holder.tv_item_message_message_idx.setText(Integer.toString(message_room_item_list.get(position).getMessage_idx()));
holder.tv_item_message_content.setText(message_room_item_list.get(position).getContent());
holder.tv_item_message_time.setText(message_room_item_list.get(position).getTime());
holder.itemView.setTag(position);
}
@Override
public int getItemCount() {
return (null != message_room_item_list ? message_room_item_list.size() : 0);
}
public class CustomViewHolder extends RecyclerView.ViewHolder {
protected TextView tv_item_message_user_nickname;
protected TextView tv_item_message_time;
protected TextView tv_item_message_content;
protected TextView tv_item_message_room_idx;
protected TextView tv_item_message_user_idx;
protected TextView tv_item_message_message_idx;
public CustomViewHolder(@NonNull final View itemView) {
super(itemView);
this.tv_item_message_user_nickname = itemView.findViewById(R.id.tv_item_message_user_nickname);
this.tv_item_message_time = itemView.findViewById(R.id.tv_item_message_time);
this.tv_item_message_content = itemView.findViewById(R.id.tv_item_message_content);
this.tv_item_message_room_idx = itemView.findViewById(R.id.tv_item_message_room_idx);
this.tv_item_message_user_idx = itemView.findViewById(R.id.tv_item_message_user_idx);
this.tv_item_message_message_idx = itemView.findViewById(R.id.tv_item_message_message_idx);
}
}
}
MainActivity.java
public class MainActivity extends BaseActivity implements MainActivityView {
private long mBackKeyPressedTime = 0;
private Toast mToast;
BottomNavigationView bottom_navigation_view_main;
FragmentAgora fragmentAgora;
FragmentRestaurant fragmentRestaurant;
FragmentMessage fragmentMessage;
FragmentMyPage fragmentMyPage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bottom_navigation_view_main = findViewById(R.id.bottom_navigation_view_main);
fragmentAgora = new FragmentAgora();
fragmentRestaurant = new FragmentRestaurant();
fragmentMessage = new FragmentMessage();
fragmentMyPage = new FragmentMyPage();
getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_main, fragmentAgora).commitAllowingStateLoss();
bottom_navigation_view_main.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.item_agora_main: {
getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_main, fragmentAgora).commitAllowingStateLoss();
return true;
}
case R.id.item_restaurant_main: {
getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_main, fragmentRestaurant).commitAllowingStateLoss();
return true;
}
case R.id.item_message_main: {
getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_main, fragmentMessage).commitAllowingStateLoss();
return true;
}
case R.id.item_mypage_main: {
getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_main, fragmentMyPage).commitAllowingStateLoss();
return true;
}
default:
return false;
}
}
});
}
片段消息.java
public class FragmentMessage extends Fragment implements FragmentMessageView{
ViewGroup viewGroup;
private ArrayList<MessageRoomItem> m_message_room_item_list;
private MessageRoomAdapter messageRoomAdapter;
private RecyclerView rv_message_box;
private LinearLayoutManager linear_layout_manager;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
viewGroup = (ViewGroup) inflater.inflate(R.layout.frag_message, container, false);
rv_message_box = viewGroup.findViewById(R.id.rv_message_box_message_list);
linear_layout_manager = new LinearLayoutManager(viewGroup.getContext());
rv_message_box.setLayoutManager(linear_layout_manager);
m_message_room_item_list = new ArrayList<>();
messageRoomAdapter = new MessageRoomAdapter(m_message_room_item_list);
rv_message_box.setAdapter(messageRoomAdapter);
trygetMessageList();
return viewGroup;
}
private void trygetMessageList() {
final FragmentMessageService fragmentMessageService = new FragmentMessageService(this);
fragmentMessageService.getMessageRoomList();
}
@Override
public void getMessageRoomListSuccess(MessageRoomResponse messageRoomResponse) {
Toast.makeText(getContext(), messageRoomResponse.getMessage(), Toast.LENGTH_SHORT).show();
switch (messageRoomResponse.getCode()){
default:
System.out.println(messageRoomResponse.getMessage());
loadMessageRooms(messageRoomResponse);
}
}
public void loadMessageRooms(MessageRoomResponse messageRoomResponse){
switch (messageRoomResponse.getCode()){
case 100:
int num_of_message_rooms = messageRoomResponse.getMessageRoomResults().size();
for (int i = 0; i < num_of_message_rooms; i++){
MessageRoomItem messageRoomItem = new MessageRoomItem();
messageRoomItem.setMessage_room_idx(messageRoomResponse.getMessageRoomResults().get(i).getMessage_room_idx());
messageRoomItem.setUser_idx(messageRoomResponse.getMessageRoomResults().get(i).getUser_idx());
messageRoomItem.setUser_nickname(messageRoomResponse.getMessageRoomResults().get(i).getUser_nickname());
messageRoomItem.setMessage_idx(messageRoomResponse.getMessageRoomResults().get(i).getMessage_idx());
messageRoomItem.setContent(messageRoomResponse.getMessageRoomResults().get(i).getContent());
messageRoomItem.setTime(messageRoomResponse.getMessageRoomResults().get(i).getTime());
m_message_room_item_list.add(messageRoomItem);
}
break;
default:
break;
}
}
}
FragmentMessageService.java
public class FragmentMessageService {
private final FragmentMessageView mFragmentMessageView;
private HashMap<String, Object> mParams;
public FragmentMessageService(final FragmentMessageView fragmentMessageView) {
this.mFragmentMessageView = fragmentMessageView;
}
public FragmentMessageService(FragmentMessageView mFragmentMessageView, HashMap<String, Object> mParams) {
this.mFragmentMessageView = mFragmentMessageView;
this.mParams = mParams;
}
void getMessageRoomList() {
final FragmentMessageRetrofitInterface fragmentMessageRetrofitInterface = getRetrofit().create(FragmentMessageRetrofitInterface.class);
fragmentMessageRetrofitInterface.getMessageRoomList(X_ACCESS_TOKEN).enqueue(new Callback<MessageRoomResponse>() {
@Override
public void onResponse(Call<MessageRoomResponse> call, Response<MessageRoomResponse> response) {
final MessageRoomResponse messageRoomResponse = response.body();
if (messageRoomResponse == null) {
mFragmentMessageView.validateFailure(null);
return;
}
mFragmentMessageView.getMessageRoomListSuccess(messageRoomResponse);
}
@Override
public void onFailure(Call<MessageRoomResponse> call, Throwable t) {
mFragmentMessageView.validateFailure(null);
}
});
}
解决方案
您正在创建一个空列表m_message_room_item_list
并将该列表设置为适配器,然后您实际上正在加载列表,但从不更新适配器。
您应该做的是在适配器内创建一个方法,例如:
public void setList(ArrayList<MessageRoomItem> message_room_item_list) {
this.message_room_item_list = message_room_item_list;
notifyDataSetChanged();
}
然后在 loadMessageRooms() 中调用它,比如:
public void loadMessageRooms(MessageRoomResponse messageRoomResponse){
switch (messageRoomResponse.getCode()){
case 100:
int num_of_message_rooms = messageRoomResponse.getMessageRoomResults().size();
for (int i = 0; i < num_of_message_rooms; i++){
MessageRoomItem messageRoomItem = new MessageRoomItem();
messageRoomItem.setMessage_room_idx(messageRoomResponse.getMessageRoomResults().get(i).getMessage_room_idx());
messageRoomItem.setUser_idx(messageRoomResponse.getMessageRoomResults().get(i).getUser_idx());
messageRoomItem.setUser_nickname(messageRoomResponse.getMessageRoomResults().get(i).getUser_nickname());
messageRoomItem.setMessage_idx(messageRoomResponse.getMessageRoomResults().get(i).getMessage_idx());
messageRoomItem.setContent(messageRoomResponse.getMessageRoomResults().get(i).getContent());
messageRoomItem.setTime(messageRoomResponse.getMessageRoomResults().get(i).getTime());
m_message_room_item_list.add(messageRoomItem);
}
messageRoomAdapter.setList(m_message_room_item_list);
break;
default:
break;
}
}
推荐阅读
- c# - 在 ASP.NET Core 中使用 SQL 视图的数据访问如何更好地构建模型?
- pandas - 我想对数据透视表进行多级排序
- azure-data-factory - Azure 数据工厂查找活动在读取有空格的列名时出现问题
- javascript - 为什么会出现错误:React.Children.only 期望接收单个 React 元素子元素。?
- spring-boot - Spring boot 2.4 - 必须在构建器或设置环境中提供显式区域以提供区域
- pandas - 熊猫分析相关警告似乎是错误的
- php - 路由登录未定义,如果管理员用户当前未登录,我在尝试将页面重定向到登录时不断收到此错误
- c - 装配中的缓冲器
- excel - 如何将一张表中的单元格内容动态复制到另一张表中?
- laravel - Livewire 复选框数组仅保存最后点击的值