简体   繁体   English

为具有多个ViewType的单个RecylerView设置不同的布局管理器

[英]Set Different Layout Manager for Single RecylerView with multiple ViewTypes

I have a RecyclerView in my Activity.It's orientation is Vertical.I have two different ViewTypes for RecyclerView item. 我的Activity中有一个RecyclerView ,它的方向是Vertical.RecyclerView项有两种不同的ViewTypes When the API response is JSONArray I need to set the entry in RecyclerView with CardViews and LayoutManager as a Horizontal. 当API响应为JSONArray我需要在RecyclerView中使用CardViews和LayoutManager将条目设置为Horizo​​ntal。
This is code for my EntryType 这是我的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();
}

This is code for my BaseViewHolder 这是我的BaseViewHolder的代码

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

    public abstract void OnBindView(ChatObject object);  

This is code for ChatAdapter 这是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();
    }
}  

This is code for MainActivity 这是MainActivity的代码

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());
}  

So how to set LayoutManager as a Horizontal for different ViewType ? 那么如何将LayoutManager设置为不同ViewType的Horizo​​ntal?

I think this can be achieved by overriding getItem(int position) method in your adapter and calling a callback in your activity/fragment. 我认为可以通过在适配器中重写getItem(int position)方法并在活动/片段中调用回调来实现。 which will set different layout managers. 这将设置不同的布局管理器。

mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true)); mRecyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,true));

use this to make recyclerview with horizontal view. 使用它可以使recyclerview具有水平视图。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM