为 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

Listview和RecyclerView区别

RecyclerView 或 ListView 的 Jetpack Compose 等价物是啥?

如何在 Kotlin 中将 listView 转换为 RecyclerView