[英]Two Recycler views inside nested scroll view
我有一個嵌套滾動視圖,在其中,我有一個包含兩個recycler views
的線性布局。 現在問題是第一個recycler view
沒有擴展到最大程度。 即第一個recycler view
列表中有5個項目,但是如果我放置包裝內容,它只顯示第一個項目。 由於包裝內容,這應該最多擴展到5個項目,但它不起作用。 如果我將高度固定為200DP
或300dp
那么它開始顯示更多高達該高度的物品。 但是,我想顯示第一個recycler view
所有項目,然后當我滾動它時,應該在第一個recycler view
項目結束后啟動第二個recycler view
項目。
我的布局是:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
android:layout_marginTop="60dp"
android:orientation="vertical">
<com.sooryen.customview.CustomTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/spacing_normal"
android:text="@string/my_booking_latest_booking_lable"
app:font="avenirltstd_medium" />
<include layout="@layout/layout_divider" />
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_ongoing_bookings"
android:visibility="visible"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layoutManager="android.support.v7.widget.LinearLayoutManager" />
<com.sooryen.customview.CustomTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="visible"
android:layout_margin="@dimen/spacing_normal"
android:text="@string/my_booking_past_booking_lable"
app:font="avenirltstd_medium" />
<include layout="@layout/layout_divider" />
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_past_bookings"
android:visibility="visible"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:nestedScrollingEnabled="false"
android:layout_marginBottom="@dimen/spacing_extra_small"
android:scrollbars="none"
app:layoutManager="android.support.v7.widget.LinearLayoutManager" />
<View
android:layout_width="match_parent"
android:layout_height="150dp" />
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
請幫忙。 我做錯了什么的地方。 我從互聯網上嘗試了很多方法,但沒有任何工作。 這是此屏幕的屏幕截圖
LABEL最新預訂有5個項目,但它只顯示一個,最多不擴展到5個項目。 然而,當我向上滾動結束時, 第二個LABEL過去的預訂工作正常並顯示所有項目。
我的java文件是:
public class MyBookingActivity extends BaseToolBarActivity implements
SwipeRefreshLayout.OnRefreshListener {
int cancelValue;
private SwipeRefreshLayout swipeRefreshLayout;
@BindView(R.id.rv_ongoing_bookings)
RecyclerView mRVOngoingBookings;
private List<MyBookingsApi.ApiResponse.Datum> mCourtDataList = new ArrayList<>();
@BindView(R.id.rv_past_bookings)
RecyclerView mRVPastBookings;
private BaseRecyclerAdapter<MyBookingsApi.ApiResponse.Datum, MyBookingsViewHolder> mBaseRecyclerAdapterMyBookings = new BaseRecyclerAdapter<MyBookingsApi.ApiResponse.Datum, MyBookingsViewHolder>(MyBookingsViewHolder.class, R.layout.layout_list_item_my_bookings) {
@Override
protected void populateViewHolder(MyBookingsViewHolder itemViewHolder, final MyBookingsApi.ApiResponse.Datum model, int position) {
String date = null;
try {
date = new SimpleDateFormat("yyyy/MM/dd", Locale.ENGLISH).format(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).parse(model.getDate()));
} catch (ParseException e) {
e.printStackTrace();
}
String sessions = "N.A.";
int CancelledValue = model.getCancelled();
if (CancelledValue == 0)
{
itemViewHolder.PaymentYesNo.setText(getString(R.string.booking_detail_no));
itemViewHolder.PaymentYesNo.setBackgroundResource(R.drawable.round_corner_linear_green);
}
else
{
itemViewHolder.PaymentYesNo.setText(getString(R.string.booking_detail_yes));
itemViewHolder.PaymentYesNo.setBackgroundResource(R.drawable.round_corner_linear_red);
}
String paymentConfirmed = model.getPayment_confirmed();
String paymentType = model.getPaymentType();
if (paymentConfirmed.equals("true"))
{
itemViewHolder.PaymentStatus.setText("Confirmed");
}
else
{
itemViewHolder.PaymentStatus.setText("Pending");
}
if (CancelledValue == 0 && paymentConfirmed.equals("false") && paymentType.equals("cash"))
{
itemViewHolder.DepositThisAmount.setText("Deposit " + String.valueOf(model.getDepositAmount()) + " SAR in " +
String.valueOf(model.getDepositTimeAllowed()) + " HRS");
}
else
{
itemViewHolder.DepositThisAmount.setVisibility(View.GONE);
}
if (model.getSession() != null)
sessions = model.getSession();
itemViewHolder.mCustomTextViewCourtBookingTime.setText(date + " " + sessions);
if (getResources().getConfiguration().locale.equals(new Locale("ar"))) {
itemViewHolder.mCustomTextViewCourtPrice.setText(model.getPrice() + " " + "ريال");
itemViewHolder.mCustomTextViewCourtCancellationCutoff.setText("يمكن الغاء الحجز قبل المباراة" + " : " + model.getCancelCutoffTime());
} else {
itemViewHolder.mCustomTextViewCourtPrice.setText(getString(R.string.price, model.getPrice()));
itemViewHolder.mCustomTextViewCourtCancellationCutoff.setText(getString(R.string.cancellation_cutoff, model.getCancelCutoffTime()));
}
String cancelshow = model.getCancelshow();
if (cancelshow.equals("true"))
{
cancelValue = 1;
itemViewHolder.mAppCompatImageViewMoreHoriz.setVisibility(View.VISIBLE);
}
else
{
cancelValue = 0;
itemViewHolder.mAppCompatImageViewMoreHoriz.setVisibility(View.GONE);
}
itemViewHolder.mCustomTextViewCourtName.setText(model.getCourtName());
itemViewHolder.mAppCompatImageViewMoreHoriz.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PopupMenu popup = new PopupMenu(MyBookingActivity.this, v);
popup.getMenu().add(0, 1, 0, getString(R.string.my_booking_cancel));
//adding click listener
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case 1:
cancelBooking(model.getId());
break;
//case 1:
// deleteBooking(model.getId());
}
return false;
}
});
//displaying the popup
popup.show();
}
});
itemViewHolder.mReaRelativeLayoutMyBooking.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//launchActivity(MyBookingDetailActivity.getActivityIntent(MyBookingActivity.this, model.getId(), "MyBooking", 1));
}
});
itemViewHolder.mAppCompatImageViewRightArrow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
launchActivity(MyBookingDetailActivity.getActivityIntent(MyBookingActivity.this, model.getId(), "MyBooking", 1));
}
});
}
};
private BaseRecyclerAdapter<PastBookingsApi.ApiResponse.Datum, MyPastBookingsViewHolder> mBaseRecyclerAdapterMyPastBookings = new BaseRecyclerAdapter<PastBookingsApi.ApiResponse.Datum, MyPastBookingsViewHolder>(MyPastBookingsViewHolder.class, R.layout.layout_list_item_my_bookings) {
@Override
protected void populateViewHolder(MyPastBookingsViewHolder itemViewHolder, final PastBookingsApi.ApiResponse.Datum model, int position) {
String date = null;
try {
date = new SimpleDateFormat("yyyy/MM/dd", Locale.ENGLISH).format(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).parse(model.getDate()));
} catch (ParseException e) {
e.printStackTrace();
}
String sessions = "N.A.";
int CancelledValue = model.getCancelled();
if (CancelledValue == 0)
{
itemViewHolder.PaymentYesNo.setText(getString(R.string.booking_detail_no));
itemViewHolder.PaymentYesNo.setBackgroundResource(R.drawable.round_corner_linear_green);
}
else
{
itemViewHolder.PaymentYesNo.setText(getString(R.string.booking_detail_yes));
itemViewHolder.PaymentYesNo.setBackgroundResource(R.drawable.round_corner_linear_red);
}
itemViewHolder.DepositThisAmount.setVisibility(View.GONE);
int paymentConfirmed = model.getPaymentConfirmed();
if (paymentConfirmed == 1)
{
itemViewHolder.PaymentStatus.setText("Confirmed");
}
else
{
itemViewHolder.PaymentStatus.setText("Pending");
}
if (model.getSession() != null)
sessions = model.getSession();
itemViewHolder.mCustomTextViewCourtBookingTime.setText(date + " " + sessions);
if (getResources().getConfiguration().locale.equals(new Locale("ar"))) {
itemViewHolder.mCustomTextViewCourtPrice.setText(model.getPrice() + " " + "ريال");
} else {
itemViewHolder.mCustomTextViewCourtPrice.setText(getString(R.string.price, model.getPrice()));
}
itemViewHolder.mCustomTextViewCourtCancellationCutoff.setText(getString(R.string.cancellation_cutoff, "0"));
itemViewHolder.mCustomTextViewCourtName.setText(model.getCourtName());
itemViewHolder.mAppCompatImageViewMoreHoriz.setVisibility(View.VISIBLE);
itemViewHolder.mAppCompatImageViewMoreHoriz.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PopupMenu popup = new PopupMenu(MyBookingActivity.this, v);
popup.getMenu().add(0, 1, 0, getString(R.string.notification_delete));
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case 1:
deleteBooking(model.getId());
break;
}
return false;
}
});
popup.show();
}
});
itemViewHolder.mAppCompatImageViewRightArrow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
launchActivity(MyBookingDetailActivity.getActivityIntent(MyBookingActivity.this, model.getId(), "MyBooking", 1));
}
});
itemViewHolder.mReaRelativeLayoutMyBooking.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// launchActivity(MyBookingDetailActivity.getActivityIntent(MyBookingActivity.this, model.getId(), "MyBooking", 1));
}
});
}
};
public static Intent getActivityIntent(Context context) {
return new Intent(context, MyBookingActivity.class);
}
private void cancelBooking(final int id) {
}
private void deleteBooking(final int id) {
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle(getString(R.string.title_activity_my_booking));
setUpRecyclerView();
setUpEmptyAdapter();
swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout);
swipeRefreshLayout.setOnRefreshListener(this);
getMyBooking();
getMyPastBooking();
/*swipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
swipeRefreshLayout.setRefreshing(true);
getMyBooking();
}
}
);*/
}
private void setUpEmptyAdapter() {
mRVPastBookings.setAdapter(new BaseEmptyRecyclerAdapter<EmptyViewHolderRefresh>(EmptyViewHolderRefresh.class, R.layout.layout_place_holderrefresh) {
@Override
protected void populateEmptyViewHolder(EmptyViewHolderRefresh viewHolder) {
viewHolder.mAppCompatImageView.setImageResource(R.drawable.no_booking_place_holder);
viewHolder.mCustomTextViewTitle.setText(R.string.no_bookings_available_title);
viewHolder.mCustomTextViewDescription.setText(R.string.no_bookings_available_description);
viewHolder.refreshText.setText(R.string.swipe);
//viewHolder.mCustomButton.setText(R.string.try_again);
viewHolder.mCustomButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//getMyPastBooking();
}
});
}
});
mRVOngoingBookings.setAdapter(new BaseEmptyRecyclerAdapter<EmptyViewHolderRefresh>(EmptyViewHolderRefresh.class, R.layout.layout_place_holderrefresh) {
@Override
protected void populateEmptyViewHolder(EmptyViewHolderRefresh viewHolder) {
viewHolder.mAppCompatImageView.setImageResource(R.drawable.no_booking_place_holder);
viewHolder.mCustomTextViewTitle.setText(R.string.no_bookings_available_title);
viewHolder.mCustomTextViewDescription.setText(R.string.no_bookings_available_description);
//viewHolder.mCustomButton.setText(R.string.try_again);
viewHolder.refreshText.setText(R.string.swipe);
viewHolder.mCustomButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// getMyBooking();
}
});
}
});
}
private void setUpRecyclerView() {
mRVOngoingBookings.setAdapter(mBaseRecyclerAdapterMyBookings);
DividerItemDecoration mDividerItemDecorationMyBookings = new DividerItemDecoration(this, LinearLayoutManager.VERTICAL);
mDividerItemDecorationMyBookings.setDrawable(ContextCompat.getDrawable(this, R.drawable.divider));
mRVOngoingBookings.addItemDecoration(mDividerItemDecorationMyBookings);
mRVPastBookings.setAdapter(mBaseRecyclerAdapterMyPastBookings);
DividerItemDecoration mDividerItemDecorationMyPastBookings = new DividerItemDecoration(this, LinearLayoutManager.VERTICAL);
mDividerItemDecorationMyPastBookings.setDrawable(ContextCompat.getDrawable(this, R.drawable.divider));
mRVPastBookings.addItemDecoration(mDividerItemDecorationMyPastBookings);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finishWithResultCancel();
}
return super.onOptionsItemSelected(item);
}
@Override
protected int getMenuResource() {
return RESOURCE_NO_MENU;
}
@Override
protected int getLayoutResource() {
return R.layout.activity_my_booking;
}
@Override
public void onResume() {
super.onResume();
registerEventBus();
//getMyBooking();
//getMyPastBooking();
}
@Override
public void onPause() {
super.onPause();
unRegisterEventBus();
}
private void getMyPastBooking() {
/// swipeRefreshLayout.setRefreshing(true);
final ProgressDialog pd = new ProgressDialog(MyBookingActivity.this);
pd.setMessage("Please wait..");
pd.show();
Handler mHandler = new Handler();
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
pd.dismiss();
startApiService(PastBookingsApi.getServiceIntent(MyBookingActivity.this, getToken()));
}
}, 800);
}
private void getMyBooking() {
// swipeRefreshLayout.setRefreshing(true);
final ProgressDialog pd = new ProgressDialog(MyBookingActivity.this);
pd.setMessage("Please wait..");
pd.show();
Handler mHandler = new Handler();
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
pd.dismiss();
startApiService(MyBookingsApi.getServiceIntent(MyBookingActivity.this, getToken()));
}
}, 2000);
//swipeRefreshLayout.setRefreshing(false);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(BaseApi.EventBusMessage eventBusMessage) {
switch (eventBusMessage.event) {
case BaseApi.EventBusMessage.EVENT_SHOW_PROGRESS_DIALOG:
showProgressDialog();
break;
case BaseApi.EventBusMessage.EVENT_HIDE_PROGRESS_DIALOG:
hideProgressDialog();
break;
default:
if (eventBusMessage.object instanceof MyBookingsApi.ApiResponse)
parseMyBookingsSuccessResponse((MyBookingsApi.ApiResponse) eventBusMessage.object);
else if (eventBusMessage.object instanceof PastBookingsApi.ApiResponse) {
parsePastBookingsSuccessResponse((PastBookingsApi.ApiResponse) eventBusMessage.object);
} else if (eventBusMessage.object instanceof BaseApi.DefaultErrorResponse) {
parseErrorResponse((BaseApi.DefaultErrorResponse) eventBusMessage.object);
} else if (eventBusMessage.object instanceof BaseApi.Error500Response) {
//parseError500Response((BaseApi.Error500Response) eventBusMessage.object);
} else if (eventBusMessage.object instanceof MyBookingCancelApi.ApiResponse) {
parseCancelBookingSuccessResponse((MyBookingCancelApi.ApiResponse) eventBusMessage.object);
} else if (eventBusMessage.object instanceof MyBookingDeleteApi.ApiResponse) {
parseDeleteBookingSuccessResponse((MyBookingDeleteApi.ApiResponse) eventBusMessage.object);
}
break;
}
}
private void parseDeleteBookingSuccessResponse(MyBookingDeleteApi.ApiResponse apiResponse) {
showSnackBar(apiResponse.getMessage());
getMyPastBooking();
}
private void parseCancelBookingSuccessResponse(final MyBookingCancelApi.ApiResponse apiResponse) {
showSnackBar(apiResponse.getMessage());
getMyBooking();
/*final ProgressDialog pd = new ProgressDialog(MyBookingActivity.this);
pd.setMessage("Please wait..");
pd.show();
Handler mHandler = new Handler();
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
pd.dismiss();
startApiService(MyBookingDeleteApi.getServiceIntent(MyBookingActivity.this, getToken(), apiResponse.getData().getId()));
}
}, 800);*/
}
private void parsePastBookingsSuccessResponse(PastBookingsApi.ApiResponse apiResponse) {
List<PastBookingsApi.ApiResponse.Datum> datumList = apiResponse.getData();
if (datumList.size() > 0) {
Collections.sort(datumList, new Comparator<PastBookingsApi.ApiResponse.Datum>()
{
@Override
public int compare(PastBookingsApi.ApiResponse.Datum o1, PastBookingsApi.ApiResponse.Datum o2) {
return o1.getId() > o2.getId() ? -1 : (o1.getId() < o2.getId() ) ? 1 : 0;
}
});
mRVPastBookings.setAdapter(mBaseRecyclerAdapterMyPastBookings);
mBaseRecyclerAdapterMyPastBookings.setItems(datumList);
} else {
mRVPastBookings.setAdapter(new BaseEmptyRecyclerAdapter<EmptyViewHolderRefresh>(EmptyViewHolderRefresh.class, R.layout.layout_place_holderrefresh) {
@Override
protected void populateEmptyViewHolder(EmptyViewHolderRefresh viewHolder) {
viewHolder.mAppCompatImageView.setImageResource(R.drawable.no_booking_place_holder);
viewHolder.mCustomTextViewTitle.setText(R.string.no_bookings_available_title);
viewHolder.mCustomTextViewDescription.setText(R.string.no_bookings_available_description);
// viewHolder.mCustomButton.setText(R.string.try_again);
viewHolder.refreshText.setText(R.string.swipe);
viewHolder.mCustomButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// getMyPastBooking();
}
});
}
});
}
}
private void parseMyBookingsSuccessResponse(MyBookingsApi.ApiResponse apiResponse) {
// mCourtDataList = apiResponse.getData();
List<MyBookingsApi.ApiResponse.Datum> datumList = apiResponse.getData();
if (datumList.size() > 0) {
Collections.sort(datumList, new Comparator<MyBookingsApi.ApiResponse.Datum>()
{
@Override
public int compare(MyBookingsApi.ApiResponse.Datum o1, MyBookingsApi.ApiResponse.Datum o2) {
return o1.getId() > o2.getId() ? -1 : (o1.getId() < o2.getId() ) ? 1 : 0;
}
});
mRVOngoingBookings.setAdapter(mBaseRecyclerAdapterMyBookings);
mBaseRecyclerAdapterMyBookings.setItems(datumList);
} else {
mRVOngoingBookings.setAdapter(new BaseEmptyRecyclerAdapter<EmptyViewHolderRefresh>(EmptyViewHolderRefresh.class, R.layout.layout_place_holderrefresh) {
@Override
protected void populateEmptyViewHolder(EmptyViewHolderRefresh viewHolder) {
viewHolder.mAppCompatImageView.setImageResource(R.drawable.no_booking_place_holder);
viewHolder.mCustomTextViewTitle.setText(R.string.no_bookings_available_title);
viewHolder.mCustomTextViewDescription.setText(R.string.no_bookings_available_description);
//viewHolder.mCustomButton.setText(R.string.try_again);
viewHolder.refreshText.setText(R.string.swipe);
viewHolder.mCustomButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//getMyBooking();
}
});
}
});
}
}
private void parseError500Response(BaseApi.Error500Response error500Response) {
showAlertDialog(R.string.session_timeout_title, R.string.session_timeout_message, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
logout();
}
});
}
private void parseErrorResponse(BaseApi.DefaultErrorResponse defaultErrorResponse) {
showSnackBar(defaultErrorResponse.getMessage());
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void noInternet(String message) {
mRVOngoingBookings.setAdapter(new BaseEmptyRecyclerAdapter<EmptyViewHolderRefresh>(EmptyViewHolderRefresh.class, R.layout.layout_place_holderrefresh) {
@Override
protected void populateEmptyViewHolder(EmptyViewHolderRefresh viewHolder) {
viewHolder.mAppCompatImageView.setImageResource(R.drawable.no_internet_placeholder);
viewHolder.mCustomTextViewTitle.setText(R.string.connection_problem_title);
viewHolder.mCustomTextViewDescription.setText(R.string.connection_problem_description);
viewHolder.refreshText.setText(R.string.swipe);
//viewHolder.mCustomButton.setText(R.string.try_again);
viewHolder.mCustomButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// getMyBooking();
}
});
}
});
mRVPastBookings.setAdapter(new BaseEmptyRecyclerAdapter<EmptyViewHolderRefresh>(EmptyViewHolderRefresh.class, R.layout.layout_place_holderrefresh) {
@Override
protected void populateEmptyViewHolder(EmptyViewHolderRefresh viewHolder) {
viewHolder.mAppCompatImageView.setImageResource(R.drawable.no_internet_placeholder);
viewHolder.mCustomTextViewTitle.setText(R.string.connection_problem_title);
viewHolder.mCustomTextViewDescription.setText(R.string.connection_problem_description);
viewHolder.refreshText.setText(R.string.swipe);
//viewHolder.mCustomButton.setText(R.string.try_again);
viewHolder.mCustomButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// getMyPastBooking();
}
});
}
});
}
}
和activity_my_booking布局是:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/swipe_refresh_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/coordinatorLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/layout_toolbar" />
<include layout="@layout/content_my_booking" />
</android.support.design.widget.CoordinatorLayout>
</android.support.v4.widget.SwipeRefreshLayout>
將第一個RecyclerView
的高度設置為wrap_content
,並將setNestedScrollingEnabled
設置為false
RecyclerView rv_ongoing_bookings= (RecyclerView) findViewById(R.id.rv_ongoing_bookings);
rv_ongoing_bookings.setNestedScrollingEnabled(false);
為了實現它,我的方法是自定義我的recyclerView適配器作為節頭回收器視圖,如下所示: https : //android-arsenal.com/details/1/4495
以下代碼將使Recycler視圖可擴展...
public class ExpandableRecyclerView extends RecyclerView
{
private boolean expanded = false;
public ExpandableRecyclerView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
public ExpandableRecyclerView(Context context)
{
super(context);
}
public ExpandableRecyclerView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public boolean isExpanded()
{
return expanded;
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
if (isExpanded())
{
int expandSpec = MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
ViewGroup.LayoutParams params = getLayoutParams();
params.height = getMeasuredHeight();
}
else
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
public void setExpanded(boolean expanded)
{
this.expanded = expanded;
}
}
用法...以你使用recycleler視圖的方式使用它...只需設置recyclerView.setExpanded(true);
您可以直接在scrollview中使用它...
所以,它不是你的問題的答案,它更像是一個使用RecyclerView
的建議,因為它應該取決於你在問題中包含的截圖。 你真的不需要創建兩個RecyclerView
來實現你需要的布局。 據我所知,你想顯示一些項目並根據某些內容放置一個帶文本的分隔符(我可以看到預訂的日期)。
在RecyclerView.Adapter
您有getItemViewType
,您可以根據某些變量返回一個int值。例如,您的getItemViewType
應如下所示:
@Override
public int getItemViewType(int position) {
MyObject myObject = mItems.get(position);
// myObject.isSeparator() is a sample function which helps you identify it you should show construct a booking view or separator
if(myObject.isSeparator()){
// this variable is declared inside your Adapter ->
// private static final int VIEW_TYPE_SEPARATOR = 1;
return VIEW_TYPE_SEPARATOR;
}
// private static final int VIEW_TYPE_BOOKING = 0;
return VIEW_TYPE_BOOKING;
}
根據這些值,您需要創建兩個ViewHolder
:
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (VIEW_TYPE_SEPARATOR == viewType) {
new SeparatorViewHolder(/* Some params which you need here */);
}
return new BookingViewHolder(/* Some other params which you need here */);
}
而且 - >
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (VIEW_TYPE_SEPARATOR == getItemViewType(position)) {
// Populate SeparatorViewHolder
} else {
// Populate BookingViewHolder
}
}
最后,您應該使用您需要的對象填充List
,以確定該項目是預訂項目還是分隔符。
我希望你有主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.