如何根据其在 onCreateViewHolder 方法中的位置在 RecyclerView 中膨胀不同的布局

How to inflate different layout in RecyclerView based on its position in onCreateViewHolder method

我正在尝试将我的 ListView 重构为 RecyclerView,但我陷入了这种情况。

In my ListView Adapter i have something like this:

@Override
public int getItemViewType(int position) {
    if (mDecommissionMode && position == getCount() - 1)
        return 1;
    return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    if (getItemViewType(position) == 0)
        return getNormalView(position, convertView, parent);
    else
        return getManualDecommissionView(convertView, parent);

}

我不知道如何将它应用到我的 RecyclerView 适配器,因为 我无法访问 onCreateViewHolder 方法中的位置,布局应该是膨胀。

Here are the methods in my RecyclerView Adapter:

@Override
public DevicesItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    DevicesRecyclerViewAdapter.DevicesItemViewHolder holder = new DevicesItemViewHolder(); //should pass some inflated view to ViewHolder instance
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mOnClickListener.onClick(view);
        }
    });
    return holder;
}


@Override
public void onBindViewHolder(DevicesItemViewHolder holder, int position) {


}

有什么办法可以解决吗?

在你的 Adapter class 中放这个

enum VIEW_TYPE {
VIEW1, VIEW2}

然后根据给定的 position 根据您的逻辑在适配器中覆盖 getItemViewType(int position) 和 return VIEW_TYPE.VIEW1.ordinal()VIEW_TYPE.VIEW2.ordinal()。在 onCreateView 中,您将获得 viewtype 值。基于 return VieHolderView

为两个布局创建两个 ViewHolder

遵循这三个简单的步骤

  • 覆盖 getItemViewType(int position)

  • Return 基于ViewType的不同ViewHolders onCreateViewHolder() 方法

  • 根据 onBindViewHolder() 中的 itemViewType 填充视图 方法(这解决了你面临的位置问题)

这是 RecyclerView Adapter 的一小段代码
可以看完整代码参考Here

public class YourListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

private static final int LAYOUT_ONE= 0;
private static final int LAYOUT_TWO= 1;

@Override
public int getItemViewType(int position)
{
    if(position==0)
        return LAYOUT_ONE;
    else
        return LAYOUT_TWO;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {


    View view =null;
    RecyclerView.ViewHolder viewHolder = null;

    if(viewType==LAYOUT_ONE)
    {
        view = LayoutInflater.from(parent.getContext()).inflate(R.layout.one,parent,false);
        viewHolder = new ViewHolderOne(view);
    }
    else
    {
        view = LayoutInflater.from(parent.getContext()).inflate(R.layout.two,parent,false);
        viewHolder= new ViewHolderTwo(view);
    }

    return viewHolder;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {


    if(holder.getItemViewType()== LAYOUT_ONE)
    {

    }
    else {

        ViewHolderOne vaultItemHolder = (ViewHolderOne) holder;
        vaultItemHolder.name.setText(displayText);
        vaultItemHolder.name.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                .......
            }
        });

    }

     
}



public class ViewHolderOne extends RecyclerView.ViewHolder {

    public TextView name;
    
    public ViewHolderOne(View itemView) {
        super(itemView);
        name = (TextView)itemView.findViewById(R.id.displayName);
        
    }
}

public class ViewHolderTwo extends RecyclerView.ViewHolder{

    public ViewHolderTwo(View itemView) {
        super(itemView);
        
        ..... Do something
    }
}
}