Android 使用来自其他对象内部对象的2个布局的Recyclerview

Android 使用来自其他对象内部对象的2个布局的Recyclerview,android,android-recyclerview,Android,Android Recyclerview,我有一个对象列表,每个对象中都有一个对象列表。 对于每个对象,我想在一个recyclerView中创建两个不同的layoutet行。 一个布局,直接从对象中获取字符串,然后从对象中为列表中的每个项目遵循另一个布局 伪码 对象主:字符串名称,列表记录 对象记录:字符串游戏,int记录 输出: 主(0).名称-(布局1) 主(0)。记录(0)。游戏-(布局2) 主(0).记录(1).游戏-(布局2) 主管道(1).名称-(布局1) 主(1).记录(0)-(布局2) 主(1).记录(1)-(布局2)

我有一个对象列表,每个对象中都有一个对象列表。 对于每个对象,我想在一个recyclerView中创建两个不同的layoutet行。 一个布局,直接从对象中获取字符串,然后从对象中为列表中的每个项目遵循另一个布局

伪码

对象主:字符串名称,列表记录

对象记录:字符串游戏,int记录

输出:

主(0).名称-(布局1)

主(0)。记录(0)。游戏-(布局2)

主(0).记录(1).游戏-(布局2)

主管道(1).名称-(布局1)

主(1).记录(0)-(布局2)

主(1).记录(1)-(布局2)

我可以用一个对象来完成,但是当我有两个或更多的主对象时,逻辑就不正确了

代码:

希望这里有一些更敏锐的大脑:-) 如果您需要更多代码,请告诉我

工作代码。Thx至卢克斯普罗格

@覆盖
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
RecyclerView.ViewHolder ViewHolder=null;
LayoutInflater充气器=LayoutInflater.from(parent.getContext());
开关(视图类型){
案例0:{
视图v=充气机。充气(R.layout.list_item_1,父项,false);
viewHolder=新的MyViewHolder(v);
打破
}
案例1:{
视图v=充气机。充气(R.layout.list_item_2,父项,false);
viewHolder=新ViewHolderTo(v);
打破
}
}
返回视图持有者;
}
@凌驾
公共无效onBindViewHolder(最终RecyclerView.ViewHolder,最终整型位置){
int[]pos=mapToRealPositions(位置);
model=mList.get(位置[0]);
开关(holder.getItemViewType()){
案例0:{
MyViewHolder viewHolder=(MyViewHolder)holder;
viewHolder.name.setText(model.getName());
打破
}
案例1:{
ViewHolderTo viewholder=(ViewHolderTo)holder;
viewholder.ting.setText(model.getRecords().get(pos[1]).getGame());
打破
}
}
}
@凌驾
public int getItemViewType(int位置){
int tmp;
如果(位置==0 | |位置==3 | |位置==21){
返回0;
}否则{
返回1;
}
}
@凌驾
public int getItemCount(){
整数计数=0;
对于(MyListModel项:mList){
count+=item.getRecords().size();
计数++;
}
返回计数;
}
//此方法将返回一个包含两个值的int数组,第一个值是主项在mList中的位置,第二个值是主项在mList中的位置
//值将是子项(在记录列表中)在maim项目中的位置
公共int[]地图位置(int回收商){
int reference=0;
对于(int i=0;i
您能分享屏幕截图吗?您希望如何在回收器视图中显示布局?仅使用一个对象。假设下面的3行名称不同:-)问题是第一行来自主对象,第二行来自主对象。三,。线条来自主对象内的对象列表。接下来的3行也是主要对象和2-3。在适配器中,您应该有一个方法将回收器使用的“扩展”位置转换为相对于mList的位置(用于从mList提取模型),如下所示:public int getDataPosition(int recyclerposition){int reference=0;for(int i=0;i @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { RecyclerView.ViewHolder viewHolder = null; LayoutInflater inflater = LayoutInflater.from(parent.getContext()); switch(viewType){ case 0:{ View v = inflater.inflate(R.layout.list_item_1, parent, false); viewHolder = new MyViewHolder(v); break; } case 1:{ View v = inflater.inflate(R.layout.list_item_2, parent, false); viewHolder = new ViewHolderTo(v); break; } } return viewHolder; } @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { switch (holder.getItemViewType()) { case 0: { model = mList.get(holder.getAdapterPosition()); MyViewHolder viewHolder = (MyViewHolder) holder; viewHolder.name.setText(model.getName()); break; } case 1: { ViewHolderTo viewholder = (ViewHolderTo) holder; viewholder.ting.setText(model.getRecords().get(position-1).getGame()); break; } } } @Override public int getItemViewType(int position) { int tmp; if(position==0||position==3||position==6){ return 0; } else{ return 1; } } @Override public int getItemCount() { int count = 0; for(MyListModel item: mList){ count += item.getRecords().size(); count++; } return count; }
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    RecyclerView.ViewHolder viewHolder = null;
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    switch(viewType){
        case 0:{
            View v = inflater.inflate(R.layout.list_item_1, parent, false);
            viewHolder = new MyViewHolder(v);
            break;
        }
        case 1:{
            View v = inflater.inflate(R.layout.list_item_2, parent, false);
            viewHolder = new ViewHolderTo(v);
            break;
        }
    }
    return viewHolder;
}

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {

    int[] pos = mapToRealPositions(position);
    model = mList.get(pos[0]);

    switch (holder.getItemViewType()) {
        case 0: {
            MyViewHolder viewHolder = (MyViewHolder) holder;
            viewHolder.name.setText(model.getName());
            break;
        }
        case 1: {
            ViewHolderTo viewholder = (ViewHolderTo) holder;
            viewholder.ting.setText(model.getRecords().get(pos[1]).getGame());
            break;
        }
    }
}

@Override
public int getItemViewType(int position) {
    int tmp;

    if(position==0||position==3||position==21){
        return 0;
    } else{
        return 1;
    }

}

@Override
public int getItemCount() {
    int count = 0;
    for(MyListModel item: mList){
        count += item.getRecords().size();
        count++;
    }
    return count;
}

// this method will return an int array with two values, first value will be the position of the main item in mList, the second
// value will be the position of the child(in the records list) in the maim item
public int[] mapToRealPositions(int recyclerPos) {
    int reference = 0;
    for(int i = 0; i < mList.size(); i ++) {
        final int childNr = mList.get(i).getRecords().size();
        if (recyclerPos < reference + 1 + childNr) {
            return new int[]{i, recyclerPos - reference - 1};
        } else {
            reference += 1 + childNr;
        }
    }
    return null;
}
}