[英]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将条目设置为Horizontal。
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的Horizontal?
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.