Android Recyclerview, загрузка изображений с URL-адресов с помощью Glide

Я могу успешно получить текстовые данные из firebase, но мне трудно сделать то же самое для изображений. Я использую представление ресайклера, и ниже приведен мой адаптер ресайклера:

public class RecyclerviewAdapter extends RecyclerView.Adapter<RecyclerviewAdapter.MyHolder>{

    List<Listdata> listdata;

    public RecyclerviewAdapter(List<Listdata> listdata) {
        this.listdata = listdata;
    }

    @Override
    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.myview,parent,false);

        MyHolder myHolder = new MyHolder(view);
        return myHolder;
    }


    public void onBindViewHolder(MyHolder holder, int position) {
        Listdata data = listdata.get(position);
        holder.vname.setText(data.getName());
        holder.vemail.setText(data.getEmail());
        holder.vaddress.setText(data.getAddress());

    }

    @Override
    public int getItemCount() {
        return listdata.size();
    }
    class MyHolder extends RecyclerView.ViewHolder{
        TextView vname , vaddress,vemail;
        ImageView thumbnail;


        public MyHolder(View itemView) {
            super(itemView);



            vname = (TextView) itemView.findViewById(R.id.vname);
            thumbnail = (ImageView) itemView.findViewById(thumbnail);
            vemail = (TextView) itemView.findViewById(R.id.vemail);
            vaddress = (TextView) itemView.findViewById(R.id.vaddress);

        }
    }


}

и вот код активности, который инициализирует процесс:

myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                list = new ArrayList<>();
                // StringBuffer stringbuffer = new StringBuffer();
                for(DataSnapshot dataSnapshot1 :dataSnapshot.getChildren()){
                    Userdetails userdetails = dataSnapshot1.getValue(Userdetails.class);
                    Listdata listdata = new Listdata();
                    String name=userdetails.getName();
                    String email=userdetails.getEmail();
                    String address=userdetails.getAddress();
                    listdata.setName(name);
                    listdata.setEmail(email);
                    listdata.setAddress(address);
                    list.add(listdata);
                    // Toast.makeText(MainActivity.this,""+name,Toast.LENGTH_LONG).show();

                }

                RecyclerviewAdapter recycler = new RecyclerviewAdapter(list);
                RecyclerView.LayoutManager layoutmanager = new LinearLayoutManager(InvestmentDrawer.this);
                recyclerview.setLayoutManager(layoutmanager);
                recyclerview.setItemAnimator( new DefaultItemAnimator());
                recyclerview.setAdapter(recycler);

            }

            @Override
            public void onCancelled(DatabaseError error) {
                // Failed to read value
                //  Log.w(TAG, "Failed to read value.", error.toException());
            }
        });
Glide.with(this)
             .load(imageData)
             .diskCacheStrategy(DiskCacheStrategy.ALL)
             .into(ivImgGlide);
        }

Я хотел бы использовать URL-адрес, введенный в базу данных, для динамической загрузки изображений. Используя glide или picasso. Ниже приведен класс Listdata.

public class Listdata {

    public String name;
    public String address;
    public String email;

    public String imageurl;

    public String getImageUrl() {
        return imageurl;
    }

    public void SetImageUrl(String imageurl) {
        this.imageurl = imageurl;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

person user8532743    schedule 11.09.2017    source источник


Ответы (1)


Вы можете использовать Picasso или скользить внутри вашего onBindViewHolder.

public class RecyclerviewAdapter extends RecyclerView.Adapter<RecyclerviewAdapter.MyHolder>{

List<Listdata> listdata;
Context context;

public RecyclerviewAdapter(List<Listdata> listdata,Context context) {
    this.listdata = listdata;
    this.context = context;
}

@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.myview,parent,false);

    MyHolder myHolder = new MyHolder(view);
    return myHolder;
}


public void onBindViewHolder(MyHolder holder, int position) {
    Listdata data = listdata.get(position);
    holder.vname.setText(data.getName());
    holder.vemail.setText(data.getEmail());

    holder.vaddress.setText(data.getAddress());

      Glide.with(context)
         .load(data.getImageUrl())
         .diskCacheStrategy(DiskCacheStrategy.ALL)
         .into(holder.thumbnail);

     //with Picasso
      Picasso.with(context)
      .load(data.getImageUrl())
      .into(holder.thumbnail);

      // you need to define a method getImageUrl() to get the image url in Listdata
}

@Override
public int getItemCount() {
    return listdata.size();
}
class MyHolder extends RecyclerView.ViewHolder{
    TextView vname , vaddress,vemail;
    ImageView thumbnail;


    public MyHolder(View itemView) {
        super(itemView);



        vname = (TextView) itemView.findViewById(R.id.vname);
        thumbnail = (ImageView) itemView.findViewById(thumbnail);
        vemail = (TextView) itemView.findViewById(R.id.vemail);
        vaddress = (TextView) itemView.findViewById(R.id.vaddress);

    }
}



}

Помните, что вам нужно передать контекст из вашей родительской активности в ваш адаптер.

В вас onDataChanged вам нужно установить URL-адрес изображения, используя SetImageUrl()

@Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            list = new ArrayList<>();
            // StringBuffer stringbuffer = new StringBuffer();
            for(DataSnapshot dataSnapshot1 :dataSnapshot.getChildren()){
                Userdetails userdetails = dataSnapshot1.getValue(Userdetails.class);
                Listdata listdata = new Listdata();
                String name=userdetails.getName();
                String email=userdetails.getEmail();
                String address=userdetails.getAddress();
                String imageUrl = userdetails.getImageUrl();
                listdata.setName(name);
                listdata.setEmail(email);
                listdata.setAddress(address);
                listdata.SetImageUrl(imageUrl);
                list.add(listdata);
                // Toast.makeText(MainActivity.this,""+name,Toast.LENGTH_LONG).show();

            }

            RecyclerviewAdapter recycler = new RecyclerviewAdapter(list,getApplicationContext());
            RecyclerView.LayoutManager layoutmanager = new LinearLayoutManager(InvestmentDrawer.this);
            recyclerview.setLayoutManager(layoutmanager);
            recyclerview.setItemAnimator( new DefaultItemAnimator());
            recyclerview.setAdapter(recycler);

        }
person Shriyansh Gautam    schedule 11.09.2017
comment
эй @ShriyanshGautman и как мне это сделать, немного новичок здесь - person user8532743; 11.09.2017
comment
не могли бы вы предоставить вам класс Listdata? - person Shriyansh Gautam; 11.09.2017
comment
у вас уже есть методы getImageUrl() и SetImageUrl() в вашем классе Listdata. Можете ли вы обновить код для класса Userdetails - person Shriyansh Gautam; 11.09.2017
comment
хорошо, я сделал это. требуется: List‹Listdata›, найден контекст: List‹Listdata› причина: фактические и формальные списки аргументов различаются по длине - person user8532743; 11.09.2017
comment
вам нужно передать контекст при инициализации адаптера RecyclerviewAdapter recycler = new RecyclerviewAdapter(list,getApplicationContext()); - person Shriyansh Gautam; 11.09.2017
comment
Если это сработало, не забудьте проголосовать и принять ответ. Если вы хотите немного редактирования, добро пожаловать! - person Shriyansh Gautam; 11.09.2017
comment
я думаю, что я не квалифицирован - person user8532743; 11.09.2017
comment
Это было очень полезно. Я забыл, что вы можете сделать это в OnBindViewHolder. Спасибо за обновление. - person wesley franks; 11.06.2019