根据值对recyclerview中的项目进行分组

时间:2017-01-13 16:02:21

标签: android android-recyclerview

我有一些POJO,其日期字段显示在RecyclerView内。现在我想仅在具有特定日期的第一个项目上显示日期。 这意味着如果我有4个日期为01/13/2017的项目,则日期应显示在第一个项目上,而不显示在其余3个项目上。 有什么想法吗?

4 个答案:

答案 0 :(得分:1)

您必须在Adapter类的onBindViewHolder方法中执行此操作。项目位置从0开始。因此,第一个项目位置将为0.对于第一个项目显示日期和其他项目设置日期查看器不可见。

public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {

    // other methods..

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        // initialize your other views

        if (position == 0){
            // set your date here
            holder.textViewDate.setText(ages.get(position));
        }else{
            // this will disappear the date viewer
            holder.textViewDate.setVisibility(View.GONE);
        }
    }
}

答案 1 :(得分:0)

在显示RecyclerView的项目之前,用布尔值标记所有第一个项目。 然后在适配器的方法中仅在标记了项目对象时显示日期信息。 显然,请记住在所有商品上显示和隐藏日期,以避免查看回收问题。

答案 2 :(得分:0)

将这样的内容添加到您的适配器:

    onBindViewHolder(..) {
       holder.itemView.dateTextView.setVisibility(hasDate(position) ? View.VISIBLE : View.GONE)
    }

    private boolean hasDate(int position){
            if (position == 0)
                return true;
            return !items.get(position).getDate().equals(items.get(position-1).getDate());
   }

答案 3 :(得分:0)

使用这种类型的recyclerView:

  1. 确保像这样扩展您的RrecyclerViewAdapter RecyclerView.Adapter

  2. 创建两个ViewHolder。

    public class RecyclersViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    
    ArrayList<Data> arrayList;
    
    Context context;
    
    public final int TYPE_DATE = 0;
    public final int TYPE_CONTENT = 1;
    
    public RecyclersViewAdapter(ArrayList<Data> arrayList, Context context) {
        this.arrayList = arrayList;
        this.context = context;
    }
    
    @Override
    public int getItemViewType(int position) {
    
    
        // Data Class have three fields : Id,Date,Title
    
        if (arrayList.get(position).getId().equals("") && arrayList.get(position).getTitle().equals(""))
            return TYPE_DATE;
        else
            return TYPE_CONTENT;
    }
    
    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
    
        if (viewType == TYPE_DATE) {
    
            View view = LayoutInflater.from(context).inflate(R.layout.recyc_row,null);
            return new contentViewHolder(view);
    
        } else {
    
            View view1 = LayoutInflater.from(context).inflate(R.layout.recyc_row1,null);
            return new dateViewHolder(view1);
        }
    
    }
    
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
    
    
       if(viewHolder instanceof contentViewHolder) {
    
           ((contentViewHolder) viewHolder).id.setText(arrayList.get(position).getId());
           ((contentViewHolder) viewHolder).title.setText(arrayList.get(position).getTitle());
        }
    
        if(viewHolder instanceof dateViewHolder) {
    
         ((dateViewHolder) viewHolder).date.setText(arrayList.get(position).getStartDate());
        }
    
    }
    
    
    public class contentViewHolder extends RecyclerView.ViewHolder {
    
        TextView id,title;
    
        public contentViewHolder(@NonNull View itemView) {
            super(itemView);
    
            id = itemView.findViewById(R.id.tv_id);
            title = itemView.findViewById(R.id.tv_title);
        }
    }
    
    public class dateViewHolder extends RecyclerView.ViewHolder {
        TextView date;
    
        public dateViewHolder(@NonNull View itemView) {
            super(itemView);
    
            date = itemView.findViewById(R.id.tv_date);
        }
    }
    
    @Override
    public int getItemCount() {
        return arrayList.size();
    }
    

    }