【问题标题】:Error in layout output:: RecyclerView: No Adapter attached; Skipping Layout布局输出错误:: RecyclerView: No Adapter attach;跳过布局
【发布时间】:2021-03-19 17:39:39
【问题描述】:

在尝试加载我正在构建的“日志查看器”时,原始预设布局不会显示为输出。我确实从我的 Firebase 数据库中获得了适当的输出,但是布局完全混乱/间隔太远。我做错了什么?

这是我的 LogActivity 类 公共类 LogActivity 扩展 AppCompatActivity {

List<Log> log;
RecyclerView recyclerView;
LogAdapter logAdapter;
DatabaseReference databaseReference;


DatabaseReference mbase; // Create object of the
// Firebase Realtime Database

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_log);
    recyclerView=findViewById(R.id.recyclerView);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    log=new ArrayList<>();

    databaseReference = FirebaseDatabase.getInstance().getReference("Logs");

    databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            for(DataSnapshot ds: snapshot.getChildren())
            {
                Log data = new Log(ds.getValue(String.class));
                log.add(data);
            }
            logAdapter = new LogAdapter(log);
            recyclerView.setAdapter(logAdapter);

        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {

        }
    });

我的适配器类如下图所示: 公共类 LogAdapter 扩展 RecyclerView.Adapter {

List<Log> logList;

public LogAdapter(List<Log> logList) {
    this.logList = logList;
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.log_layout, parent,false);
    ViewHolderClass viewHolderClass = new ViewHolderClass(view);

    return viewHolderClass;
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

    ViewHolderClass viewHolderClass=(ViewHolderClass)holder;
    Log log=logList.get(position);
    viewHolderClass.lockState.setText(log.getLockState());


}

@Override
public int getItemCount() {
    return logList.size();
}

public class ViewHolderClass extends RecyclerView.ViewHolder{

    TextView lockState;


    public ViewHolderClass(@NonNull View itemView) {
        super(itemView);
        lockState=itemView.findViewById(R.id.log_string);
    }
}

所有这些都与我的“日志”类互锁,该类只保存来自我的 firebase 数据库的字符串

公共类日志{

private String lockState;

public Log() {

}

public Log(String lockState) {
    this.lockState = lockState;
}

public String getLockState() {
    return lockState;
}

public void setLockState(String lockState) {
    this.lockState = lockState;
}

以下是我的活动日志的 XML

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/relativeLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cardBackground"
tools:context=".LogActivity">

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginStart="4dp"
    android:layout_marginTop="4dp"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

我的 log_layout 文件的 XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/log_layout"
android:orientation="vertical">


<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/log_string"
    android:text="20sp"
    android:textColor="@android:color/black">

</TextView>

最后是我成功获取和显示的简单字符串:

firebase-database

这里有我的实​​际输出: (向下滚动,下一个输出就在那里)

app-output

【问题讨论】:

  • 请编辑您的问题并将您的数据库结构添加为 JSON 文件或至少是屏幕截图。
  • 我已经编辑了这个问题,希望现在更清楚:)

标签: java android firebase firebase-realtime-database android-recyclerview


【解决方案1】:

您收到以下警告,因为它既不是错误也不是异常:

Error in layout output:: RecyclerView: No Adapter attached; Skipping Layout

因为您正在尝试读取数据库中“日志”位置中不存在的“日志”对象。如果那里存在 Log 对象,您的数据库架构将如下所示:

Firebase-root
  |
  --- Logs
       |
       --- -MW6C...tJ_2
             |
             --- lockState: "14h01 - Connected - Locker is NOT empty"

这意味着在 Logs 节点下,您有一个按键,在该按键下存在一个“Log”类型的对象。在您的架构中,您只推送了仅包含一些字符串的键,因此会发出警告。有两种解决方案。第一种是按照上面解释的方式更改架构,或者使用 String 类型的适配器类,not Log

【讨论】:

  • 谢谢你,我按照你的建议做了,我更新了你提到的层次结构;但我的输出看起来还是一样;每个项目都被大量隔开,并且不尊重我在回收/列表视图 XML 文件中设置的边距。我也收到与以前相同的警告;使用新架构
  • “大量间隔”是布局问题,而定义您的问题的警告消息是“未连接适配器;跳过布局”,这是由另一个问题生成的。不过,话虽如此,您也可以考虑尝试set the adapter outside the callback, and inside just notify the adapter about the changes
  • 谢谢!以这种方式修复了警告错误。给你的道具亚历克斯
  • 很高兴听到这个消息。不客气,Tomasteel!
猜你喜欢
  • 2020-10-28
  • 2019-07-19
  • 2021-11-26
  • 2023-01-18
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 2018-06-20
相关资源
最近更新 更多