首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不能附加ViewHolder视图

不能附加ViewHolder视图
EN

Stack Overflow用户
提问于 2021-01-12 20:54:20
回答 1查看 448关注 0票数 1

我是android编程的新手。我有一个可以插入到云防火墙中的应用程序,它还需要读取cloud中的数据。当我试图打开读取数据的活动时,它一直在崩溃。logcat给出了这个错误

代码语言:javascript
运行
复制
2021-01-12 21:20:56.733 25524-25524/com.example.ppw1 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.ppw1, PID: 25524
java.lang.IllegalStateException: ViewHolder views must not be attached when created. Ensure that you are not passing 'true' to the attachToRoot parameter of LayoutInflater.inflate(..., boolean attachToRoot)
    at androidx.recyclerview.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:7080)
    at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6235)
    at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6118)
    at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6114)
    at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2303)
    at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1627)
    at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
    at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
    at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
    at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3851)
    at androidx.recyclerview.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1897)
    at androidx.recyclerview.widget.RecyclerView$1.run(RecyclerView.java:414)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871)
    at android.view.Choreographer.doCallbacks(Choreographer.java:683)
    at android.view.Choreographer.doFrame(Choreographer.java:616)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6077)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

我的代码是:

代码语言:javascript
运行
复制
package com.example.ppw1;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.firebase.ui.firestore.FirestoreRecyclerAdapter;
import com.firebase.ui.firestore.FirestoreRecyclerOptions;

import android.os.Bundle;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.Query;

public class ListActivities extends AppCompatActivity {

    private FirebaseAuth mAuth;
    private FirebaseFirestore db = FirebaseFirestore.getInstance();
    private CollectionReference todoRef = db.collection("users");
    private ToDoAdapter adapter;
    private RecyclerView mFirestoreList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_activities);

        this.setTitle("List Activity");

        mAuth = FirebaseAuth.getInstance();

        setUpRecyclerView();

        mFirestoreList = findViewById(R.id.firestore_list);
    }

    private void setUpRecyclerView()
    {
        Query query = todoRef.whereEqualTo("Email", mAuth.getCurrentUser().getEmail());

        FirestoreRecyclerOptions<ToDoItem> options = new FirestoreRecyclerOptions.Builder<ToDoItem>().setQuery(query,ToDoItem.class).build();


        adapter = new ToDoAdapter(options);

        RecyclerView recyclerView = findViewById(R.id.firestore_list);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(adapter);
    }

    @Override
    protected void onStart()
    {
        super.onStart();
        adapter.startListening();
    }

    @Override
    protected void onStop()
    {
        super.onStop();
        adapter.stopListening();
    }
}

我的DoToAdapter代码处理了大部分的查询,我认为错误肯定是这些类中的一个,但我不确定。

代码语言:javascript
运行
复制
package com.example.ppw1;

import android.text.format.DateUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.firebase.ui.firestore.FirestoreRecyclerAdapter;
import com.firebase.ui.firestore.FirestoreRecyclerOptions;
import com.squareup.okhttp.Request;

public class ToDoAdapter extends FirestoreRecyclerAdapter<ToDoItem, ToDoAdapter.ToDoHolder> {

  // Listener listene r;

    /**
     * Create a new RecyclerView adapter that listens to a Firestore Query.  See {@link
     * FirestoreRecyclerOptions} for configuration options.
     *
     * @param options
     */
    public ToDoAdapter(@NonNull FirestoreRecyclerOptions<ToDoItem> options) {
        super(options);
    }

    @Override
    protected void onBindViewHolder(@NonNull ToDoHolder holder, int position, @NonNull ToDoItem model) {

        holder.title.setText(model.getTitle());
        holder.description.setText(model.getDesc());

       // String timeAgo = (String) DateUtils.getRelativeTimeSpanString(model.getTimeAdded().getSeconds())*1000;
      // holder.dateAdded.setText(timeAgo);


    }

    @NonNull
    @Override
    public ToDoHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_to_do_item, parent);

        return new ToDoHolder(v);
    }


    class ToDoHolder extends RecyclerView.ViewHolder {

        TextView title, description, dateAdded;


        public ToDoHolder(@NonNull View itemView) {
            super(itemView);
            title = itemView.findViewById(R.id.todoTitle);
            description = itemView.findViewById(R.id.todoDesc);
           // dateAdded = itemView.findViewById(R.id.dateAdded);
        }
    }

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-12 21:30:19

java.lang.IllegalStateException:创建ViewHolder视图时不能附加。确保您没有将'true‘传递给LayoutInflater.inflate的LayoutInflater.inflate参数(.,布尔attachToRoot)

如果attachToRoot参数不是null,则ViewGroup的默认值为真,请参见2-arg膨胀法

代码语言:javascript
运行
复制
public View inflate(@LayoutRes int resource, @Nullable ViewGroup root) {
    return inflate(resource, root, root != null);
}

因此,在膨胀项目布局时,需要使用方法将第三个attachToRoot参数设置为false

代码语言:javascript
运行
复制
@NonNull
@Override
public ToDoHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_to_do_item, parent, false);

    return new ToDoHolder(v);
}

attachToRoot是否应该将膨胀的层次结构附加到根参数?如果为false,根只用于为XML中的根视图创建正确的LayoutParams子类。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65691899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档