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