-1

我创建了一个会议应用程序,为此我使用改进的网络调用获取会议事件详细信息为JSON.iam。基于JSON数据,iam相应地填充了我的recyclerview。基本上它是一个垂直recyclerview内的水平recyclerview。iam试图实现的是将所有在水平recyclerview和其他垂直回收视图中同时发生的事件。请帮我在acheiving this.below是我的垂直和水平适配器Android中基于JSON数据动态实现嵌套RecyclerView的问题

立式适配器

public class VerticalAdapter extends RecyclerView.Adapter { 

private ArrayList<EventModel> mEventList; 
private Context mContext; 
private Map<Integer, Parcelable> scrollStatePositionsMap = new HashMap<>(); 
private static final String TAG = VerticalAdapter.class.getSimpleName(); 
private ArrayList<EventModel> tempList; 

public VerticalAdapter(ArrayList<EventModel> mEventList, Context mContext) { 
    this.mEventList = mEventList; 
    this.mContext = mContext; 
    this.tempList = new ArrayList<>(); 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    VerticalItemBinding binding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.vertical_item, parent, false); 
    return new EventViewHolder(binding); 
} 

@Override 
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { 
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext); 
    linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); 



    ((EventViewHolder) holder).mBinding.horizontalGridView.setLayoutManager(linearLayoutManager); 
    ((EventViewHolder) holder).mBinding.horizontalGridView.setAdapter(new HorizontalAdapter(mEventList, mContext)); 
    ((EventViewHolder) holder).setPosition(position); 
    if (scrollStatePositionsMap.containsKey(position)) { 
     ((EventViewHolder) holder).mBinding.horizontalGridView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
      @Override 
      public boolean onPreDraw() { 
       ((EventViewHolder) holder).mBinding.horizontalGridView.getViewTreeObserver().removeOnPreDrawListener(this); 
       ((EventViewHolder) holder).mBinding.horizontalGridView.getLayoutManager().onRestoreInstanceState(scrollStatePositionsMap.get(position)); 
       return false; 
      } 
     }); 
    } 
} 

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

private class EventViewHolder extends RecyclerView.ViewHolder { 
    public int position; 
    private VerticalItemBinding mBinding; 

    public EventViewHolder(VerticalItemBinding binding) { 
     super(binding.getRoot()); 
     this.mBinding = binding; 
     mBinding.horizontalGridView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
      @Override 
      public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
       super.onScrollStateChanged(recyclerView, newState); 
       if (newState == RecyclerView.SCROLL_STATE_IDLE) { 
        scrollStatePositionsMap.put(position, recyclerView.getLayoutManager().onSaveInstanceState()); 
       } 
      } 

      @Override 
      public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
       super.onScrolled(recyclerView, dx, dy); 
      } 
     }); 

    } 

    public void setPosition(int position) { 
     this.position = position; 
    } 
} 
} 

水平适配器代码

public class HorizontalAdapter extends RecyclerView.Adapter { 

private ArrayList<EventModel> mEventList; 
private Context mContext; 
private static String TAG = HorizontalAdapter.class.getSimpleName(); 

public HorizontalAdapter(ArrayList<EventModel> mEventList, Context mContext) { 
    this.mEventList = mEventList; 
    this.mContext = mContext; 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    HorizontalItemBinding binding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.horizontal_item, parent, false); 
    return new EventViewHolder(binding); 
} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    StartsOn startsOn = mEventList.get(position).getStartsOn(); 
    EndsOn endsOn = mEventList.get(position).getEndsOn(); 


    ((EventViewHolder) holder).mBinding.textTime.setText(startsOn.getDate().substring(11, 16)); 
    ((EventViewHolder) holder).mBinding.textEndtime.setText(endsOn.getDate().substring(11, 16)); 
    ((EventViewHolder) holder).mBinding.setEvents(mEventList.get(position)); 
} 

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

private class EventViewHolder extends RecyclerView.ViewHolder { 

    private HorizontalItemBinding mBinding; 

    public EventViewHolder(HorizontalItemBinding binding) { 
     super(binding.getRoot()); 
     this.mBinding = binding; 
    } 
} 
} 

我的网络CALL

NetworkInterface networkInterface = retrofit.create(NetworkInterface.class); 
    Call<ArrayList<EventModel>> call = networkInterface.getEvents(query); 
    Log.d(TAG, "populateFirstEvent: making call to "+query); 
    call.enqueue(new Callback<ArrayList<EventModel>>() { 
     @Override 
     public void onResponse(Call<ArrayList<EventModel>> call, Response<ArrayList<EventModel>> response) { 
      if (response.isSuccessful()) { 
       mBinding.verticalList.setVisibility(View.VISIBLE); 
       mBinding.emptyView.setVisibility(View.GONE); 

       mEventList.addAll(response.body()); 
       mBinding.verticalList.setAdapter(new HorizontalAdapter(mEventList,getApplicationContext())); 
       mBinding.verticalList.setLayoutManager(new LinearLayoutManager(getApplicationContext())); 
      } 
     } 
     @Override 
     public void onFailure(Call<ArrayList<EventModel>> call, Throwable t) { 
      Log.d(TAG, "onFailure: " + t.getLocalizedMessage()); 
      mBinding.verticalList.setVisibility(View.GONE); 
      mBinding.emptyView.setVisibility(View.VISIBLE); 
     } 
    }); 
+0

在github中查看此项目。这可能会帮助你。 https://github.com/comeondude/NestedScrollViewWithViewPagerAndRecyclerView –

+0

谢谢,对于回应 –

回答

0

你可以使用单RecycleView和单个适配器。使用GridLayoutManager作为您的RecylcerView的布局管理器。就以它的构造看

GridLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout) 

以水平为导向和spanCount是行数 - “落在同一时间组中的所有事件”。所以你应该排序你的事件。如果不同的行有不同的事件编号 - 用一些虚假的空事件来填补空白。

您应该将RecycleView放入ScrollView中,使其垂直滚动。

+0

可以提供代码示例/代码段吗?请 –