【问题标题】:Android Recycler View with multiple Views [duplicate]具有多个视图的Android Recycler View [重复]
【发布时间】:2019-11-15 18:17:37
【问题描述】:

我正在制作一个应用程序,我想将文本、图像和视频都放在单独的 ViewHolders 中(类似于 Instagram 和 Facebook)。我知道我们必须使用具有多个 ViewTypes 的 Recycler View 。我使用 firebase 作为我的存储。如何从 firebase 检索项目并将它们放置在适当的 ViewHolder 中。请帮帮我。

【问题讨论】:

    标签: java android firebase firebase-storage


    【解决方案1】:

    公共类 GovtjobsAdapter 扩展 RecyclerView.Adapter {

    private List<GovtjobBean> govtjobList;
    
    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView tv_govtjob_title,tv_govtjob_lastdatetoapply,tv_govtjob_location;
    
        public MyViewHolder(View view) {
            super(view);
            tv_govtjob_title = (TextView) view.findViewById(R.id.tv_govtjobs_title);
            tv_govtjob_lastdatetoapply = (TextView) view.findViewById(R.id.tv_govtjob_lastdatetoapply);
            tv_govtjob_location = (TextView) view.findViewById(R.id.tv_govtjob_location);
        }
    }
    
    
    public GovtjobsAdapter(List<GovtjobBean> govtjobList) {
        this.govtjobList = govtjobList;
    }
    
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.govtjob_lists, parent, false);
    
        return new MyViewHolder(itemView);
    }
    
    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        GovtjobBean govtjoblist = govtjobList.get(position);
        holder.tv_govtjob_title.setText(govtjoblist.getGovt_title());
        holder.tv_govtjob_lastdatetoapply.setText(govtjoblist.getGovt_lastdatetoapply());
        holder.tv_govtjob_location.setText(govtjoblist.getGovt_location());
    }
    
    @Override
    public int getItemCount() {
        return govtjobList.size();
    }
    

    }

    【讨论】:

      【解决方案2】:

      您可以使用适配器的getItemViewType(int position) 方法来执行此操作。在此方法中,您可以检查当前位置的项目类型,如果它是图像、视频或文本,并为每个返回特定值。然后在您的onCreateViewHolder(ViewGroup parent, Int viewType) 中,您可以使用viewType 参数来增加您的视图。

      【讨论】:

        【解决方案3】:

        您需要创建一个自定义回收器视图类,在其中覆盖 onCreateViewHolder(ViewGroup parent, Int viewType)。

        这是我的例子:

        (1) 在您的 recyclerview 类中创建自定义视图持有者类。示例:

        class ViewHolderCurrent extends RecyclerView.ViewHolder {
        
            TextView locationTV;
            TextView conditionTV;
            ...
        
            public ViewHolderCurrent(View listItemView) {
                super(listItemView);
        
                locationTV = listItemView.findViewById(R.id.location_main_4);
                conditionTV = listItemView.findViewById(R.id.condition_main_4);
                ...
            }
        }
        

        (2) 将 onCreateViewHolder 覆盖到您的自定义视图持有者:

        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            switch (viewType) {
                case 1:
                    View viewCurrent = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item4, parent, false);
                    return new ViewHolderCurrent(viewCurrent);
        
                case 2:
                ...
        
                case 3:
                ...
            }
        
            return null;
        }
        

        (3)重写 onBindViewHolder() 以填充您选择的视图。示例:

        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            switch (holder.getItemViewType()) {
                case 1:
                    ViewHolderCurrent viewHolderCurrent = (ViewHolderCurrent) holder;
        
                    viewHolderCurrent.locationTV.setText(*text*);
                    viewHolderCurrent.conditionTV.setText(*text*);
        
                    break;
        
                case 2:
                ...
                }
        }
        

        我的完整源代码是here

        【讨论】:

          【解决方案4】:

          您必须使用 recyclerview ViewTypes,请查看此链接中的示例:

          Android RecyclerView Example – Multiple ViewTypes

          或者您可以使用 FastAdapter 之类的库,它是处理适配器项目类型的很棒的库:

          https://github.com/mikepenz/FastAdapter

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-01-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-11-28
            相关资源
            最近更新 更多