如何根据其在 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 VieHolder
和 View
为两个布局创建两个 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
}
}
}
我正在尝试将我的 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 VieHolder
和 View
为两个布局创建两个 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
}
}
}