【问题标题】:No adapter attached; skipping layout (Recyclerview)未连接适配器;跳过布局(Recyclerview)
【发布时间】:2021-05-04 17:19:30
【问题描述】:

我想显示来自 firebase 实时数据库的图片。 (带有加密图像(字符串)) 喜欢Encrypted Image is "photo"

我运行这个应用recyclerview没有出现错误代码

没有连接适配器;跳过布局

ItemObject.java

    public class ItemObject {
    
            private String title;
            private String Photo;
    
            public String getTitle() {
                return title;
            }
    
            public void setTitle(String title) {
                this.title = title;
            }
    
            public String getPhoto() {
                return Photo;
            }
    
            public void setPhoto(String photo){
    
                this.Photo=photo;
            }
    
            public ItemObject(String title, String photo) {
            this.title = title;
            this.Photo=photo;
            }
            public ItemObject() {}
    
        }

Recyclerview adpater MyAdapter.java

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.RecyclerViewHolders> {

    private Context context;
    private ArrayList<ItemObject> mItem;
    private AdapterView.OnItemClickListener mListener = null;



    public class RecyclerViewHolders extends RecyclerView.ViewHolder
            implements View.OnCreateContextMenuListener {

         TextView title;
         ImageView imageView;
     //   private CardView cardView;


        public RecyclerViewHolders(@NonNull View itemView) {
            super(itemView);
            this.title =  itemView.findViewById(R.id.title_listitem);
            this.imageView = itemView.findViewById(R.id.photo_listitem);

//
            itemView.setOnCreateContextMenuListener(this);


        }


    private final MenuItem.OnMenuItemClickListener onEditMenu = new MenuItem.OnMenuItemClickListener() {

        @Override
        public boolean onMenuItemClick(MenuItem item) {
            switch (item.getItemId()) {
                case 1001:
                    mItem.remove(getAdapterPosition());
                    notifyItemRemoved(getAdapterPosition());
                    notifyItemRangeChanged(getAdapterPosition(), mItem.size());

                    break;
            }
            return true;

        }
    };

        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
            MenuItem Delete = menu.add(Menu.NONE,1001,1,"삭제");
            Delete.setOnMenuItemClickListener(onEditMenu);
        }
    }


        public MyAdapter(ArrayList<ItemObject> item){
             this.context = context;
             this.mItem = item;
    }
    @NonNull
    @Override
    public RecyclerViewHolders onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.listitem,viewGroup,false);
        RecyclerViewHolders viewHolders=new RecyclerViewHolders(view);
        return viewHolders;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerViewHolders holder, int position) {
      /*  Glide.with(context)
                .load(mItem.get(position).getPhoto())
                .into(holder.imageView);

       */
        ItemObject itemObject = mItem.get(position);
        String photo = itemObject.getPhoto();
        holder.title.setTextSize(TypedValue.COMPLEX_UNIT_SP,10);
        holder.title.setGravity(Gravity.CENTER);
        holder.title.setText(itemObject.getTitle());
        holder.imageView.setImageURI(Uri.parse(photo));
//       Glide.with(this.context).load(mItem.get(position).getPhoto()).centerCrop().into(holder.imageView);



    }

    public void setmItem(ArrayList<ItemObject> mItem) {
        this.mItem = mItem;
    }


    public void deleteItem(int position) {

            mItem.remove(position);

            notifyItemRemoved(position);



    }



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

MainUpload.java

mRecyclerView = findViewById(R.id.recyclerview_main_list);
        int numberOfColumns = 3;
        GridLayoutManager mGridLayoutManager = new GridLayoutManager(getApplication(),numberOfColumns);
        mRecyclerView.setLayoutManager(mGridLayoutManager);
        mRecyclerView.setHasFixedSize(true);

        reference = FirebaseDatabase.getInstance().getReference();

        mItem = new ArrayList<>();

        //clearAll();
        loadPhoto();


        DividerItemDecoration dividerItemDecoration=new DividerItemDecoration(mRecyclerView.getContext(),mGridLayoutManager.getOrientation());
        mRecyclerView.addItemDecoration(dividerItemDecoration);

        mRecyclerView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), mRecyclerView, new ClickListener() {
            @Override
            public void onClick(View view, int position) {

                ItemObject itemObject = mItem.get(position);

                Intent intent = new Intent(getApplicationContext(), DetailActivity.class);
                intent.putExtra("title",itemObject.getTitle());
                intent.putExtra("photo",itemObject.getPhoto());
                startActivity(intent);
            }

            @Override
            public void onLongClick(View view, int position) {
            }
        }));

函数 loadPhoto()

   private void loadPhoto() {
        FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser();
        String key = FirebaseDatabase.getInstance().getInstance().getReference("users")
                .child(currentUser.getUid()).child("Object").getKey();
        DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("users")
                .child(currentUser.getUid()).child("Object").child(key);
        databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {

                    mRecyclerView = findViewById(R.id.recyclerview_main_list);
                    int numberOfColumns = 3;
                    GridLayoutManager mGridLayoutManager = new GridLayoutManager(getApplication(),numberOfColumns);
                    mRecyclerView.setLayoutManager(mGridLayoutManager);
                    mRecyclerView.setHasFixedSize(true);

                    ItemObject itemObject = new ItemObject();
                    //여기서 에러
                    String En1 = snapshot.child("photo").getValue().toString();
                    byte []En2 = En1.getBytes();
                    AESCoderAndriod aesCoderAndriod = new AESCoderAndriod();
                    try {
                        byte []Dn1 = aesCoderAndriod.decrypt(seed,En2);
                        Bitmap Dn2 = byteArrayToBitmap(Dn1);
                        Uri Dn3 = getImageUri(getApplicationContext(),Dn2);
                        itemObject.setPhoto(Dn3.toString());
                        itemObject.setTitle(snapshot.child("title").getValue().toString());
                        mItem.add(itemObject);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }


                    //   itemObject.setPhoto(snapshot.child("Photo").getValue().toString());

                }
                //myAdapter= new MyAdapter(getApplicationContext(),mItem);
               // mRecyclerView.setAdapter(myAdapter);
                myAdapter = new MyAdapter(mItem);
                mRecyclerView.setAdapter(myAdapter);
                myAdapter.notifyDataSetChanged();



            }

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

            }
        });


    }

有什么问题?我连接适配器和recyclerview,并设置gridmanager。

【问题讨论】:

  • 只需将适配器设置为您的回收视图。
  • 我在 loadPhoto() 中设置了 Adapter

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


【解决方案1】:

您应该首先设置您的适配器,从空的回收器视图开始,当数据加载时您应该通知您的适配器有关更改。

mRecyclerView.setLayoutManager(mGridLayoutManager);
mRecyclerView.setHasFixedSize(true);
mItem = new ArrayList<>();
myAdapter = new MyAdapter(mItem);
mRecyclerView.setAdapter(myAdapter);
loadPhoto();

您的函数已经包含通知数据更改方法。您不需要在数据加载方法上设置新的布局管理器

 @Override
 public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    ItemObject itemObject = new ItemObject();
                    //여기서 에러
                    String En1 = snapshot.child("photo").getValue().toString();
                    byte []En2 = En1.getBytes();
                    AESCoderAndriod aesCoderAndriod = new AESCoderAndriod();
                    try {
                        byte []Dn1 = aesCoderAndriod.decrypt(seed,En2);
                        Bitmap Dn2 = byteArrayToBitmap(Dn1);
                        Uri Dn3 = getImageUri(getApplicationContext(),Dn2);
                        itemObject.setPhoto(Dn3.toString());
                        itemObject.setTitle(snapshot.child("title").getValue().toString());
                        mItem.add(itemObject);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }


                    //   itemObject.setPhoto(snapshot.child("Photo").getValue().toString());

                }
                myAdapter.notifyDataSetChanged();
            }

【讨论】:

  • 感谢您的建议,但仍然有相同的错误消息
  • 啊!没有错误,但无法显示数据库中的图像....
  • 在通知适配器有关更改之前,请检查您可以从数据库中获取项目的日志。您可以记录 mItem 列表的大小。现在您没有关于附加回收站视图的错误,而是其他问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
  • 2016-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多