【问题标题】:Is there a way to prevent the skipping of layout for the recyclerview?有没有办法防止跳过 recyclerview 的布局?
【发布时间】:2021-04-07 10:57:12
【问题描述】:

基本上该应用程序只是一个简单的待办事项列表,但是当我添加新任务时,它会出现在 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);
        }
    }
}

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

【问题讨论】:

  • 还有……你想避免什么错误?
  • 对不起,如果这个问题有点令人困惑并且不是很精确,但是我在发布它时遇到了麻烦,因为有很多类似的问题(我已经看过但我没有帮助)我编辑了问题,现在出现错误,再次抱歉!

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


【解决方案1】:

在为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); 
}

来源https://stackoverflow.com/a/58251986/12596713

【讨论】:

  • 好的,首先感谢您的回复。我想这些更改应该在 MainActivity.java 中完成,所以在我设置 layoutmanager 之后,我添加了你写的三行,然后在 ondatachange 方法中我添加了你写的内容,删除了你所说的赋值行。但错误仍然存​​在。也许我应该在管理新数据的课程上做第二部分?但是在那个类中我没有对recyclerview的引用......因为recyclerview是MainActivity.java的一个字段
  • 整个代码放在主类中。
  • 是的 MainActicity 是主要课程,所以我做对了
  • 好的,问题出在 firebase 上,您的解决方案和对数据库的一些更改可以正常工作,非常感谢!
  • Firebase 回调已在主/UI 线程上调用,因此此 MainActivity.this.runOnUiThread(() -&gt; doesAdapter.notifyDataSetChanged()); 可以简化为 doesAdapter.notifyDataSetChanged()
猜你喜欢
  • 2020-01-04
  • 2016-07-15
  • 2018-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-06
  • 1970-01-01
  • 2020-10-14
相关资源
最近更新 更多