Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有办法防止跳过recyclerview的布局?_Java_Android_Firebase_Firebase Realtime Database_Android Recyclerview - Fatal编程技术网

Java 有没有办法防止跳过recyclerview的布局?

Java 有没有办法防止跳过recyclerview的布局?,java,android,firebase,firebase-realtime-database,android-recyclerview,Java,Android,Firebase,Firebase Realtime Database,Android Recyclerview,应用程序基本上只是一个简单的待办事项列表,但当我添加新任务时,它会出现在firebase上,但不会出现在我的应用程序上,给出错误信息 “E/RecyclerView:未连接适配器;跳过布局”。 我试图按照stackoverflow上的答案来修复它,但没有一个对我有帮助,可能是我错误地将调整调整适应了我的代码。我只是在学习,这是我的第一个项目,我是按照一个教程来做的。 无论如何,这是MainActivity.java: @Override protected void onCreate(B

应用程序基本上只是一个简单的待办事项列表,但当我添加新任务时,它会出现在firebase上,但不会出现在我的应用程序上,给出错误信息 “E/RecyclerView:未连接适配器;跳过布局”。 我试图按照stackoverflow上的答案来修复它,但没有一个对我有帮助,可能是我错误地将调整调整适应了我的代码。我只是在学习,这是我的第一个项目,我是按照一个教程来做的。 无论如何,这是MainActivity.java

@Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        

        buttonadd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v){
                Intent a = new Intent(MainActivity.this, AggiungiPiattoAttivity.class);
                startActivity(a);
            }
        });

        //working with data
        ourdoes = findViewById(R.id.ourdoes);
        ourdoes.setLayoutManager(new LinearLayoutManager(this));

        list = new ArrayList<MyDoes>();

        //get data from firebase
        reference = FirebaseDatabase.getInstance(URL).getReference().child("AppLista");
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                //set code to retrive data and replace layout
                for (DataSnapshot dataSnapshot1: dataSnapshot.getChildren())
                {
                    MyDoes p = dataSnapshot1.getValue(MyDoes.class);
                    list.add(p);
                }
                doesAdapter = new DoesAdapter(MainActivity.this, list);
                ourdoes.setAdapter(doesAdapter);
                doesAdapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                //set code to show an error
                Toast.makeText(getApplicationContext(), "No Data", Toast.LENGTH_SHORT).show();
            }
        });

    }
这是我的适配器类:

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

    buttonaddnewpiatto.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        //insert data to database
        reference = FirebaseDatabase.getInstance(URL).getReference().child("BoxDoese").child("Does" + doesNum);
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                dataSnapshot.getRef().child("titledoes").setValue(addnamenewpiattosetted.getText().toString());
                dataSnapshot.getRef().child("descdoes").setValue(adddescnewpiattosetted.getText().toString());
                dataSnapshot.getRef().child("qualcosaalpostodiunimmagine").setValue(addrecipenewpiattosetted.getText().toString());

                Intent a = new Intent( AggiungiPiattoAttivity.this, MainActivity.class);
                startActivity(a);
            }

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

            }
        });
    }
});
public class DoesAdapter extends RecyclerView.Adapter<DoesAdapter.MyViewHolder> {

    Context context;
    ArrayList<MyDoes> myDoes;

    public DoesAdapter(){
    }

    public DoesAdapter(Context c, ArrayList<MyDoes> p ){
        context = c;
        myDoes=p;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        return new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.item_does, viewGroup, false));
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i) {
        myViewHolder.titledoes.setText(myDoes.get(i).getTitledoes());
        myViewHolder.qualcosaalpostodiunimmagine.setText(myDoes.get(i).getQualcosaalpostodiunimmagine());
        myViewHolder.descdoes.setText(myDoes.get(i).getDescdoes());

    }

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

    class MyViewHolder extends RecyclerView.ViewHolder{

        TextView titledoes, descdoes, qualcosaalpostodiunimmagine;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            titledoes = (TextView) itemView.findViewById(R.id.titledoes);
            qualcosaalpostodiunimmagine = (TextView) itemView.findViewById(R.id.qualcosaalpostodiunimmagine);
            descdoes = (TextView) itemView.findViewById(R.id.descdoes);
        }
    }
}
公共类DoesAdapter扩展了RecyclerView.Adapter{
语境;
ArrayList MyDos;
公共DoesAdapter(){
}
公共DoesAdapter(上下文c,数组列表p){
上下文=c;
mydos=p;
}
@非空
@凌驾
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup ViewGroup,int i){
返回新的MyViewHolder(LayoutFlater.from(上下文)。充气(R.layout.item_does,viewGroup,false));
}
@凌驾
public void onBindViewHolder(@NonNull MyViewHolder MyViewHolder,int i){
myViewHolder.titledoes.setText(mydos.get(i.getTitledoes());
myViewHolder.qualcsaalpostodiunimmagine.setText(mydos.get(i).getqualcsaalpostodiunimmagine());
myViewHolder.descdos.setText(mydos.get(i.getDescdoes());
}
@凌驾
public int getItemCount(){
返回myDoes.size();
}
类MyViewHolder扩展了RecyclerView.ViewHolder{
TextView标题DOES、DESCDO、qualcosaalpostodiunimmagine;
公共MyViewHolder(@NonNull View itemView){
超级(项目视图);
titledoes=(TextView)itemView.findViewById(R.id.titledoes);
qualcosaalpostodiunimmagine=(TextView)itemView.findViewById(R.id.qualcosaalpostodiunimmagine);
descdoes=(TextView)itemView.findViewById(R.id.descdoes);
}
}
}

我还有其他类,但为了避免放置太多代码,它们不应该相关。

在为
RecyclerView
设置
LayoutManager
的同时创建一个空适配器:将其另存为类的字段:

recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
doesAdapter = new DoesAdapter(MainActivity.this, list);
recyclerView.setAdapter(DoesAdapter);
当数据准备就绪时,填充适配器并通知:

public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
   /// origin code here
  for (DataSnapshot dataSnapshot1: dataSnapshot.getChildren())
            {
                MyDoes p = dataSnapshot1.getValue(MyDoes.class);
                list.add(p);
            }
  // reset data in adapter and not re-creating adapter:
  doesAdapter.setItems(list);
  doesAdapter.notifyDataSetChanged();
 // instead of  doesAdapter = new DoesAdapter(MainActivity.this, list);
  recyclerView.setAdapter(DoesAdapter); 
}

来源

和。。。你想避免什么错误?请原谅,如果这个问题有点混乱,不太准确,但是我在发布它时遇到了麻烦,因为有很多类似的问题(我已经看到了,但我没有帮助),不管怎样,我编辑了这个问题,现在出现了错误,再次抱歉!好的,首先谢谢你的回复。我想这些更改应该在MainActivity.java中完成,所以在我设置layoutmanager之后,我添加了您编写的三行,然后在ondatachange方法中添加了您编写的内容,如您所说删除了赋值行。但错误依然存在。也许我应该在管理新数据的课堂上做第二部分?但在那个类中,我没有引用recyclerview。。。因为recyclerview是MainActivity.java的一个字段,整个代码都放在主类中。是的,MainActivity是主类,所以我做对了。那么现在问题出在哪里?好的,问题也出在firebase上,有了你的解决方案和对数据库的一些更改,非常感谢!