简体   繁体   English

向RecyclerView Adapter添加多个对象

[英]Add more than one object to RecyclerView Adapter

In my fragment FilteredResultsFragment.java I have a recycler view with an ImageView which displays an image that is retrieved from the Firebase Realtime database . 在我的片段FilteredResultsFragment.java我有一个带有ImageView回收器视图 ,其中显示了从Firebase Realtime数据库检索的图像。 This code here is from my FilteredResultaFragment.java 这段代码来自我的FilteredResultaFragment.java

public class FilteredResultsFragment extends android.support.v4.app.Fragment {
ImageAdapter imageAdapter;
List<String> listOfImages = new ArrayList<>();
List<String> listOfNames = new ArrayList<>();
private RecyclerView recyclerView;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View viewFilteredResults = inflater.inflate(R.layout.fragment_filtered_results, container, false);
    recyclerView = viewFilteredResults.findViewById(R.id.recyclerViewFiltered);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    imageAdapter = new ImageAdapter(listOfImages);
    imageAdapter = new ImageAdapter(listOfNames);
    recyclerView.setAdapter(imageAdapter);
    return viewFilteredResults;
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        if (getArguments() != null) {
            listOfImages.addAll(getArguments().getStringArrayList("listOfImages"));
            imageAdapter.notifyDataSetChanged();
        }
    }
}

As you can see, I've created an Adapter for my Recycler View . 如您所见,我已经为Recycler View创建了一个适配器。 Its name is ImageAdapter.java and there is where I display the image into my ImageView . 它的名称是ImageAdapter.java ,在此处将图像显示到ImageView中 Everything works fine, as you can see: 一切正常,如您所见:

在此处输入图片说明

The problem is, I want to display a TextView too with a value. 问题是,我也想显示一个带有值的TextView。 How can I achieve that? 我该如何实现? Here is my ImageAdapter-java 这是我的ImageAdapter-java

public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ImageViewHolder> {
List<String> listaPaisesFiltrados;
List<String> listaNomesFiltrados;

ImageAdapter(List<String> listaPaisesFiltrados) {
    this.listaPaisesFiltrados = listaPaisesFiltrados;

}

@NonNull
@Override
public ImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.list_item_view, parent, false);


    return new ImageViewHolder(itemView);
}

@Override
public void onBindViewHolder(@NonNull ImageViewHolder holder, int position) {
    String imageUrl = listaPaisesFiltrados.get(holder.getAdapterPosition());
    Log.d("ADAPTER", "imageUrl : " + imageUrl + " position : " + holder.getAdapterPosition());

    Glide.with(holder.imageView.getContext()).load(imageUrl).centerCrop().into(holder.imageView);
}

@Override
public int getItemCount() {
    Log.d("ADAPTER", "SIZE : " + listaPaisesFiltrados.size());
    return listaPaisesFiltrados.size();
}


public class ImageViewHolder extends RecyclerView.ViewHolder {
    ImageView imageView;

        public ImageViewHolder(View itemView) {

            super(itemView);
            imageView = itemView.findViewById(R.id.imgPaisFiltrado);

        }
    }

}

By the way, the values that I want to display in the TextView are already retrieved and I send them to the ImageAdapter throuh my FilteredResults.java this way imageAdapter = new ImageAdapter(listOfNames); 顺便说一句,我要显示在TextView中的值已经被检索到, ImageAdapter我的FilteredResults.java将它们发送到ImageAdapter方法是imageAdapter = new ImageAdapter(listOfNames);

All you need to do to accomplish that is to create a new layout with an imageview and a textview. 完成此操作所需要做的就是创建一个具有imageview和textview的新布局。

For example if you made it and called it city_thumbnail_view Then in your onCreateViewHolder you would do. 例如,如果创建并命名为city_thumbnail_view,则可以在onCreateViewHolder中进行。

View itemView = LayoutInflater.from(parent.getContext())
        .inflate(R.layout.city_thumnail_view, parent, false);

Then in your ViewHolder you would just add the textview with its id name 然后在您的ViewHolder中,只需添加带有其id名称的textview

public class ImageViewHolder extends RecyclerView.ViewHolder {
    ImageView imageView;
    TextView textView;

    public ImageViewHolder(View itemView) {

        super(itemView);
        imageView = itemView.findViewById(R.id.imgPaisFiltrado);
        textView = itemView.findViewById(R.id.cityName);
    }
}

Then in your onBindViewHolder instead of just having a List of Strings you would need to create an object that holds the cityName and the imageUrl. 然后,在您的onBindViewHolder中,您不仅需要创建一个字符串列表,还需要创建一个对象,其中包含cityName和imageUrl。

@Override
public void onBindViewHolder(@NonNull ImageViewHolder holder, int position) {
    myCityNameObject city = listaPaisesFiltrados.get(holder.getAdapterPosition());

    textView.setText(city.cityName);    
    Glide.with(holder.imageView.getContext()).load(imageUrl).centerCrop().into(holder.imageView);
}

Here is an example of what the object could look like. 这是对象外观的示例。

public class City
{
    // Instance Variables
    String cityName;
    String cityImageUrl;

    // Constructor Declaration of Class
    public City(String cityName, String cityImageUrl)
    {
        this.cityname = cityName;
        this.cityImageUrl = cityImageUrl;
    }

    // Get City
    public String getCityName()
    {
        return cityName;
    }

    // Set City
    public String setCityName(String name)
    {
        cityName = name;
    }

    // Get City Image Url
    public int getCityImageUrl()
    {
        return cityImageUrl;
    }

    // Set City Image Url
    public String setCityImageUrl(String url)
    {
    cityImageUrl = url;
    }
}

Here is what your Adapter should look like after the changes 更改后,您的适配器应该是这样的

public class ImageAdapter extends RecyclerView.Adapter { 
    List<City> listaPaisesFiltrados; 

    ImageAdapter(List<City> listaPaisesFiltrados) {
    this.listaPaisesFiltrados = listaPaisesFiltrados;

    }

    @NonNull
    @Override
    public ImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int             viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.city_thumnail_view, parent, false);


        return new ImageViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull ImageViewHolder holder, int position) {
    City city = listaPaisesFiltrados.get(position);

    holder.cityNameTextView.setText(city.getCityName());    
    Glide.with(holder.imageView.getContext()).load(imageUrl).centerCrop().into(holder.imageView);
    }

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


    public class ImageViewHolder extends RecyclerView.ViewHolder {
        ImageView imageView;
        TextView cityNameTextView;

            public ImageViewHolder(View itemView) {

            super(itemView);
            imageView = itemView.findViewById(R.id.imgPaisFiltrado);
            cityNameTextView = itemView.findViewById(R.id.cityNameText);
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM