-1

会議アプリケーションを作成して、ネットワークイベントのためにretrofitを使用してJSON.iamとして会議イベントの詳細を取得します。 JSONデータに基づいて、私はそれに応じて私のrecyclerviewにデータを設定します。これは垂直なrecyclerview.what内の水平なリサイクルビューです。iamは水平リサイクルビューで同じ時間に落ちるすべてのイベントをグループ化し、しなさいthis.belowをacheivingで私を助けては垂直方向と水平方向のアダプタAndroidのJSONデータに基づいてネスト化されたRecyclerViewを動的に実装する際の問題

VERTICALアダプタ

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

HORIZONTALアダプタの私のコードです

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

MYネットワーク呼び出し

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と単一アダプタを使用することができます。 RecylcerViewのレイアウトマネージャとしてGridLayoutManagerを使用します。そのコンストラクタに見てみましょう

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

オリエンテーションとしてHORIZONTAL取るとspanCountは行数である - 「グループ同時期に入るすべてのイベント」。だからあなたのイベントを並べ替える必要があります。行ごとに異なるイベント番号がある場合 - いくつかの偽の空のイベントでギャップを埋める。

RecycleViewをScrollViewに配置して、垂直方向にスクロールさせる必要があります。

+0

コードサンプル/スニペットを提供できますか?お願いします –

関連する問題