如何创建具有多个视图的ListView

时间:2018-01-06 07:39:56

标签: java android listview android-recyclerview

我的问题是 - 如何创建自定义列表视图,而不仅仅是重复一个自定义视图,但像在Instagram或其他应用程序中列表包含其他视图,它看起来像滚动视图与列表视图android其他视图在其中但罗曼盖伊说,滚动视图中的列表视图是一种非常糟糕的方式,并且我同意它,不相信谷歌会用这种方式...... < / p>

使用ListView或Recycler View实现此功能的最佳方法是什么

enter image description here

enter image description here

3 个答案:

答案 0 :(得分:3)

要实现该UI,您必须为Listview或Recyclerview定义多种视图类型;一个非常相似的问题已被回答here

在您的示例中,您将有两种视图类型:

这个概念有很多tutorials。我建议您在实施中使用Recyclerview,因为advantages over Listview

答案 1 :(得分:2)

嘿,这就是你的主要片段的样子:

package com.leoneo.stackoverflow;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.soulpatch.stackoverflow.R;

import java.util.ArrayList;

public class RecyclerViewExample extends Fragment {
    private ArrayList<Object> mValues = new ArrayList<>();
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        final RecyclerView recyclerView = inflater.inflate(R.layout.recycler_view_example, container, false);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        final MultpleItemAdapter adapter = new MultpleItemAdapter(mValues);
        recyclerView.setAdapter(adapter);
        return recyclerView;
    }
}

这是你的适配器代码。

package com.leoneo.stackoverflow;

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;

import com.soulpatch.stackoverflow.R;

import java.util.ArrayList;

public class MultpleItemAdapter extends RecyclerView.Adapter<MultpleItemAdapter.ViewHolder> {
    private ArrayList<Object> mValues = new ArrayList<>();

    public MultpleItemAdapter(ArrayList<Object> values) {
        mValues = values;
    }

    enum ItemType {
        TYPE_A,
        TYPE_B;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        switch (viewType) {
            case 1:
                //Inflate Type A layout
                final LinearLayout linearLayoutA = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_a, parent, false);
                //And pass the view to the ViewHolder
                return new ViewHolder(linearLayoutA);
            break;
            case 2:
                //Inflate Type B layout
                final LinearLayout linearLayoutB = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_b, parent, false)
                //And pass the view to the ViewHolder
                return new ViewHolder(linearLayoutB);
            break;
        }
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        switch (getItemViewType(position)) {
            case 1:
                final TypeA typeA = (TypeA) mValues.get(position);
                //Deal with the views that you defined for LinearLayout A
                break;
            case 2:
                final TypeB typeB = (TypeB) mValues.get(position);
                //Deal with the views that you defined for LinearLayout B
                break;
        }
    }

    @Override
    public int getItemCount() {
        return mValues.size();
    }

    @Override
    public int getItemViewType(int position) {
        final Object obj = mValues.get(position);
        if (obj instanceof TypeA) {
            return ItemType.TYPE_A.ordinal();
        } else if (obj instanceof TypeB) {
            return ItemType.TYPE_B.ordinal();
        }
        return super.getItemViewType(position);
    }

    static class ViewHolder extends RecyclerView.ViewHolder {

        public ViewHolder(View itemView) {
            super(itemView);
        }
    }

    //Class that I want to be displayed in a CardView
    private class TypeA {
    }

    //Class that I want to be displayed in a a LinearLayout
    private class TypeB {
    }
}

您可以拥有任意数量的课程,例如TypeATypeB,并相应地向ItemType课程添加类型。 假设您之前使用过RecyclerViews,休息应该是非常自我解释的。

答案 2 :(得分:2)

您正在寻找不同的视图类型。使用这些

是可能的

GetViewTypeCount()这是一个可覆盖的方法,它返回listview-recycleview中有多少种视图类型。

getItemViewType(int pos)获取应在给定位置返回的项目视图类型

例如,如果您想在每10个项目中添加不同的视图,并且只有2种类型的视图,则应使用如下代码:

@Override
public int getItemViewType(int position){
    if (position % 10 == 0)
        return SECOND_ITEM;
    return FIRST_ITEM;
}
@Override
public int getViewTypeCount() {
    return 2;
}

getView()函数中,您可以使用switch-case或if-else结构来处理它:

switch (getItemViewType(cursor.getPosition())) {
            case SECOND_ITEM:
                //something to do
                break;

            default:

                //something to do
}

您可能希望在上面的switch-case语句中使用2个不同的布局文件来充气。但是,如果两个项目的布局没有太大差别,我建议只创建一个布局,并根据您想要获得的项目使其中的视图可见并消失。

哦,如果你不知道在哪里使用它们,你可以在适配器类中使用它们。函数可能因您使用的适配器类型而异,但它们都使用相同的逻辑。

最后,我建议你使用recyclerview。它实现比listview更难,但它是listview的一个很好的替代,它更强大,更灵活。你可以为它做一个研究。

以下是如何实现这一点,如instagram,facebook等:您在给定位置充气可滚动视图。

我希望答案有所帮助。

一如既往 祝你今天愉快。