为 listview 或 recyclerview 更改单个项目的布局
Posted
技术标签:
【中文标题】为 listview 或 recyclerview 更改单个项目的布局【英文标题】:Changing the layout of individual item for listview or recyclerview 【发布时间】:2016-01-10 22:57:00 【问题描述】:我正在尝试制作一个 recyclerview 或 listview。我遇到的复杂情况是,我要显示的一些项目是带有文本的图像,而有些是视频。我在想我可以将 videoview 和 imageviews 放在同一个列表项 xml 布局上并以编程方式隐藏。我可以制作视频视图列表和带有文本的图像列表,但是当涉及到两者都取决于用户选择的内容时,我不确定从哪里开始。
感谢您的帮助。
【问题讨论】:
【参考方案1】:我只是整理了一个简单的示例,因为我很好奇以最有效的方式实现这一目标的最佳方式是什么。这就是我为了实现膨胀不同观点而拼凑起来的。
我正在使用 RecyclerView 并根据我在模型中设置的内容来扩充列表项。对于此示例,我使用 setPos() 和 getPos()。如果是图像,我将视频设置为 0 和 1。然后在 getItemViewType 中,我检查 getPos() 是 0 还是 1。如果是 0,它膨胀 ViewHolderImage,如果它是 0,它膨胀 ViewHolderVideo。希望这可以帮助。
这是这个简单的回收器的样子。
public class Main2Activity extends AppCompatActivity
List<Items> items;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
items = new ArrayList<>();
items.add(new Items().setItems("IMAGE", 0));
items.add(new Items().setItems("VIDEO", 1));
items.add(new Items().setItems("IMAGE", 0));
items.add(new Items().setItems("IMAGE", 0));
items.add(new Items().setItems("VIDEO", 1));
RecyclerView recycler = (RecyclerView) findViewById(R.id.main_recycler);
recycler.setLayoutManager(new LinearLayoutManager(this));
ExampleRecyclerAdapter exampleRecyclerAdapter = new ExampleRecyclerAdapter(items);
recycler.setAdapter(exampleRecyclerAdapter);
// Model
public class Items
String item;
int pos;
// 0 = image
// 1 = video
public Items setItems(String item, int pos)
Items newItem = new Items();
newItem.setItem(item);
newItem.setPos(pos);
return newItem;
public String getItem()
return item;
public void setItem(String item)
this.item = item;
public int getPos()
return pos;
public void setPos(int pos)
this.pos = pos;
// RecyclerAdapter
public class ExampleRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
private static final int VIEW_HOLDER_IMAGE = 0;
private static final int VIEW_HOLDER_VIDEO = 1;
private List<Items> listItem;
public ExampleRecyclerAdapter(List<Items> listItem)
this.listItem = listItem;
@Override
public int getItemViewType(int position)
if (listItem.get(position).getPos() == 0)
return VIEW_HOLDER_IMAGE;
else
return VIEW_HOLDER_VIDEO;
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
switch (viewType)
case VIEW_HOLDER_IMAGE:
return new ViewHolderImage(LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_image, parent, false));
case VIEW_HOLDER_VIDEO:
return new ViewHolderVideo(LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_video, parent, false));
default:
return null;
@Override
public void onBindViewHolder(RecyclerView.ViewHolder v, int pos)
if (v instanceof ViewHolderImage) // Handle Image Layout
ViewHolderImage viewHolderImage = (ViewHolderImage) v;
viewHolderImage.textView.setText(String.format("%s %d", listItem.get(pos).getItem(), listItem.get(pos).getPos()));
viewHolderImage.itemView.setTag(viewHolderImage);
else if (v instanceof ViewHolderVideo) // Handle Video Layout
ViewHolderVideo viewHolderVideo = (ViewHolderVideo) v;
viewHolderVideo.textView.setText(String.format("%s %d", listItem.get(pos).getItem(), listItem.get(pos).getPos()));
viewHolderVideo.itemView.setTag(viewHolderVideo);
@Override
public int getItemCount()
return listItem.size();
public class ViewHolderImage extends RecyclerView.ViewHolder
private TextView textView;
public ViewHolderImage(final View itemView)
super(itemView);
textView = (TextView) itemView.findViewById(R.id.main_textView);
public class ViewHolderVideo extends RecyclerView.ViewHolder
private TextView textView;
public ViewHolderVideo(final View itemView)
super(itemView);
textView = (TextView) itemView.findViewById(R.id.main_textView);
activity_main2.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_recycler"
android:layout_
android:layout_
tools:context="transfast.com.teststuff.Main2Activity" />
recycler_image.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_textView"
android:layout_
android:layout_
android:background="@color/white"
android:clickable="true"
android:gravity="center"
android:textSize="16sp" />
recycler_video.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_textView"
android:layout_
android:layout_
android:background="@android:color/black"
android:clickable="true"
android:gravity="center"
android:textColor="@android:color/white"
android:textSize="16sp" />
【讨论】:
以上是关于为 listview 或 recyclerview 更改单个项目的布局的主要内容,如果未能解决你的问题,请参考以下文章
Android中RecyclerView嵌套RecyclerView或嵌套ListView
排列 listView 或 recyclerView 项目,如chipGroup
Android:重新绑定 ListView 或 RecyclerView 而不刷新 Header