Android 为具有多个视图类型的单个RecylerView设置不同的布局管理器

Android 为具有多个视图类型的单个RecylerView设置不同的布局管理器,android,android-recyclerview,Android,Android Recyclerview,我的活动中有一个RecyclerView。它的方向是垂直的。我有两个不同的ViewTypes用于RecyclerView项目。当API响应为JSONArray时,我需要使用cardwiews和LayoutManager将回收视图中的条目设置为水平。 这是我的EntryType的代码 public abstract class ChatObject { public static final int INPUT_OBJECT = 0; public static final int

我的活动中有一个
RecyclerView
。它的方向是垂直的。我有两个不同的
ViewTypes
用于RecyclerView项目。当API响应为
JSONArray
时,我需要使用
cardwiews
和LayoutManager将回收视图中的条目设置为水平。
这是我的EntryType的代码

public abstract class ChatObject {
    public static final int INPUT_OBJECT = 0;
    public static final int RESPONSE_OBJECT = 1;
    public static final int FOODIE_CARDS = 2;

    private String text;
    private String name, phone, city;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    @NonNull
    public String getText() {
        return text;
    }

    public void setText(@NonNull String text) {
        this.text = text;
    }

    public abstract int getType();
}
这是我的BaseViewHolder的代码

public abstract class BaseViewHolder extends RecyclerView.ViewHolder {
    public BaseViewHolder(View itemView) {
        super(itemView);
    }

    public abstract void OnBindView(ChatObject object);  
这是ChatAdapter的代码

public class ChatAdapter extends RecyclerView.Adapter<BaseViewHolder> {

    private ArrayList<ChatObject> chatObjects;

    public ChatAdapter(ArrayList<ChatObject> chatObjects){
        this.chatObjects=chatObjects;
    }
    @Override
    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater=LayoutInflater.from(parent.getContext());
        View itemView;
        switch (viewType){
            case ChatObject.INPUT_OBJECT:
                itemView=inflater.inflate(R.layout.input,parent,false);
                return  new ChatInputView(itemView);
            case ChatObject.RESPONSE_OBJECT:
                itemView=inflater.inflate(R.layout.response_text,parent,false);
                return new ChatOutputView(itemView);
            case ChatObject.FOODIE_OBJECT:
                itemView=inflater.inflate(R.layout.foodie_detail,parent,false);
                return new FoodieView(itemView);
            default:
                itemView=inflater.inflate(R.layout.response_text,parent,false);
                return  new ChatOutputView(itemView);
        }
    }

    @Override
    public void onBindViewHolder(BaseViewHolder holder, int position) {
        holder.OnBindView(chatObjects.get(position));

    }

    @Override
    public int getItemViewType(int position) {
        return chatObjects.get(position).getType();
    }

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

那么如何将LayoutManager设置为不同视图类型的水平视图呢?

mRecyclerView.setLayoutManager(新的LinearLayoutManager(这个,LinearLayoutManager.Horizontal,true))


使用此选项可以使recyclerview具有水平视图。

我认为这可以通过在适配器中重写getItem(int position)方法并在活动/片段中调用回调来实现。这将设置不同的布局管理器。

您能再解释一下您想做什么吗?一个
RecyclerView
中不能有两个不同的布局管理器,因为列表不能同时水平和垂直滚动。您正在尝试创建2d列表吗?是的。我想要相同的Recyclerview条目,当我在Recyclerview中有多个卡片视图时,它可以水平滚动。这对您有用吗?
RecyclerView recyclerView;
EditText input;
ChatAdapter adapter;
ChatPresenter chatPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    recyclerView=(RecyclerView)findViewById(R.id.rv_chat);
    input=(EditText)findViewById(R.id.et_search_box);
    input.setOnEditorActionListener(searchListener);
    this.chatPresenter=new ChatPresenter();
    chatPresenter.attachView(this);
    this.adapter=new ChatAdapter(chatPresenter.getChatObjects());
    recyclerView.setAdapter(adapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
    recyclerView.setItemAnimator(new DefaultItemAnimator());
}