android - 使用基于类别的分段标题实现 RecyclerView

标签 android android-recyclerview

我正在尝试使用基于列表类别的自定义分段标题来实现 RecyclerView。我已经有一个根据类别排序的列表,所以当且仅当一行的类别与前一行的类别不同时,我想膨胀标题。我一直在弄清楚如何去做,但这里有些事情困扰着我。它有效,但不显示正确的行。我认为这是因为标题导致项目数量增加。谁能帮帮我?

这是我的适配器:

List<Notes> notes;
OnItemClickListener mItemClickListener;
private static final int TYPE_CATEGOORY = 0;
private static final int TYPE_ITEM = 1;
String changing = "";

public OneNoteAdapter(List<Notes> logs) {
    this.notes = logs;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if(viewType == TYPE_CATEGOORY){
        View itemView = LayoutInflater.
                from(parent.getContext()).
                inflate(R.layout.category_header, parent, false);
        return new HeaderViewHolder(itemView);
    }else{
        View itemView = LayoutInflater.
                from(parent.getContext()).
                inflate(R.layout.learn_card, parent, false);
        return new ItemViewHolder(itemView);
    }

}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    if(holder instanceof HeaderViewHolder){
        Notes note = notes.get(position);
        ((HeaderViewHolder) holder).vCategoryText.setText(note.category);
    }else {
        ItemViewHolder item = (ItemViewHolder) holder;
        Notes note = notes.get(position);
        item.vNotesNote.setText(note.notes);
        item.vNotesCat.setText(note.category);
    }
}

@Override
public int getItemViewType(int position) {
    if((!(notes.get(position).category).equals(changing))){
        changing = notes.get(position).category;
        return TYPE_CATEGOORY;
    }else{
        return TYPE_ITEM;
    }
}

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



public class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

    protected TextView vNotesNote, vNotesCat;

    private final Context context;

    public ItemViewHolder(View itemView) {
        super(itemView);
        vNotesNote = (TextView) itemView.findViewById(R.id.notes_notes);
        vNotesCat = (TextView) itemView.findViewById(R.id.notes_category);
        context = itemView.getContext();
        itemView.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        if(mItemClickListener != null){
            mItemClickListener.onItemClick(v, getPosition());
        }
    }
}

public class HeaderViewHolder extends RecyclerView.ViewHolder {

    protected TextView vCategoryText;

    public HeaderViewHolder(View itemView) {
        super(itemView);
        vCategoryText = (TextView) itemView.findViewById(R.id.category_header_text);
    }
}

public interface OnItemClickListener{
    public void onItemClick(View v, int poition);
}

public void setOnItemClickListener (final OnItemClickListener mItemClickListener){
    this.mItemClickListener = mItemClickListener;
}

谢谢

最佳答案

尝试用以下方法替换您的 onBindViewHoldergetItemViewType 方法:

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    if (holder instanceof HeaderViewHolder) {
        ((HeaderViewHolder) holder).vCategoryText.setText(notes.get(position + 1).category);
    } else {
        ItemViewHolder item = (ItemViewHolder) holder;
        Notes note = notes.get(position);
        item.vNotesNote.setText(note.notes);
        item.vNotesCat.setText(note.category);

        if (position + 1 < notes.size() &&
            !notes.get(position + 1).category.equals(note.category)) {
            notes.add(position + 1, null);
        }
    }
}

@Override
public int getItemViewType(int position) {
    if (notes.get(position) == null) {
        return TYPE_CATEGOORY;
    } else {
        return TYPE_ITEM;
    }
}

并且您可以删除 String changing = "";

关于android - 使用基于类别的分段标题实现 RecyclerView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35682292/

相关文章:

android - 用户滑动时展开/折叠布局

php - 如何在另一个文件中执行后使用php变量的值

android - Greendao Autoincrement插入记录不起作用

android - RecyclerView 的弹跳效果

java - Android 的 recyclerView 项目上的 OnClick 函数

android - 如何处理垂直 RecyclerView 时间轴?

android - 如何为多个宽度 :height ratio to avoid jump/lag/jank? 的图像优化 RecyclerView

Android 是否可以获取包名的缓存目录路径?

android - Android SDK 更改后的 Eclipse 错误

android - 如何从 Travis build 中知道确切的错误