更改列表视图或回收视图的单个项目的布局

Changing the layout of individual item for listview or recyclerview

我正在尝试制作回收站视图或列表视图。我遇到的问题是我要显示的一些项目是带有文本的图像,有些是视频。我在想我可以将 videoview 和图像视图放在同一个列表项 xml 布局上并以编程方式隐藏。我可以制作视频视图列表和带有文本的图像列表,但是当涉及到根据用户选择的内容进行这两项操作时,我不确定从哪里开始。

感谢您的帮助。

我只是整理了一个简单的示例,因为我很好奇以最有效的方式实现这一目标的最佳方式是什么。这就是我为了夸大不同观点而放在一起的东西。

我正在使用 RecyclerView 并根据我在模型中设置的内容扩充列表项。对于这个例子,我使用 setPos() 和 getPos()。如果它是图像,我将视频的 setPos() 设置为 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_width="match_parent"
    android:layout_height="match_parent"
    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_width="match_parent"
    android:layout_height="72dp"
    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_width="match_parent"
    android:layout_height="72dp"
    android:background="@android:color/black"
    android:clickable="true"
    android:gravity="center"
    android:textColor="@android:color/white"
    android:textSize="16sp" />