Related
my problem is same as link given below
I have a ViewPager by same fragments RecyclerView just load items in one fragment of ViewPager
but at this post no one solve issue...
I have a recycler view items...I want when I click on recycler view item it takes me to viewpager fragment and shows that data of clicked item dynamically and on swiping viewpager it should move previous and next fragment accordingly...under fragment I want to show data of recyclerrview item using single fragment...
I have done this by using multiple fragment and using multiple instances by different name and different layout name and different id for its recyclerView and it works but i have a large number of fragments and it is not the solution for me ):
here is my viewpager code
public class AndroidViewPagerExample extends FragmentActivity {
ViewPager pager;
int positionring;
String rgtv;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.mainuuuu);
Intent it = getIntent();
positionring = it.getIntExtra("POS", 0);
final int position = it.getIntExtra("POS", 0);
rgtv= it.getStringExtra("name");
pager = (ViewPager) findViewById(R.id.pager);
pager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
pager.setPageTransformer(true, new RotateUpTransformer());
pager.setCurrentItem(position);
pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
Boolean first = true;
Boolean userScrollChange=false;
public void onPageScrollStateChanged(int state) {
System.out.println("onPageScrollStateChanged");
System.out.println("Current position=="+position);
int curreentpos=position;
int newpos=curreentpos+1;
int previousState=curreentpos-1;
if (previousState == pager.SCROLL_STATE_DRAGGING
&& state == pager.SCROLL_STATE_SETTLING)
userScrollChange = true;
else if (previousState == pager.SCROLL_STATE_SETTLING
&& state == pager.SCROLL_STATE_IDLE)
userScrollChange = false;
previousState = state;
}
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
System.out.println("onPageScrolled");
}
public void onPageSelected(int position) {
// Check if this is the page you want.
System.out.println("onPageSelected");
Apples.newInstance(rgtv);
}
});
}
private class MyPagerAdapter extends FragmentPagerAdapter {
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
#Override
public android.support.v4.app.Fragment getItem(int position) {
return Apples.newInstance(rgtv);
}
#Override
public int getCount() {
return ringtonelist.size();
}
}
#Override
public void onBackPressed() {
// if (pager.getCurrentItem() != 36) {
// pager.setCurrentItem(36);
// } else {
Vp_Ringtoneplaybtn.Playstop();
super.onBackPressed();
// }
}
}
code given below is adapter code
public class RingToneAdapter extends RecyclerView.Adapter<RingToneAdapter.RingToneViewHolder> {
public int mSelectedItem = -1;
static MediaPlayer mp;
View view;
static Context rcntx;
int oldpossssssss;
List<RingTone_Items> ringtonelist;
private TextView hello, close;
ImageView prev, next;
private ImageView iconplay;
private InterstitialAd mInterstitialAd;
Dialog MyDialog;
static final int[] resID = {R.raw.a48, R.raw.funny_hen, R.raw.funny_roster_1, R.raw.funny_roster_2, R.raw.rooster_1, R.raw.rooster_2,R.raw.rooster_3,R.raw.funny_cock,R.raw.a12,R.raw.a45,R.raw.a44,R.raw.a43,R.raw.a31, R.raw.a10,R.raw.chicken_1,R.raw.chick_2,R.raw.chick_3,R.raw.chick_4,R.raw.chick_5,R.raw.chick_6};
public RingToneAdapter(Context rcntx, List<RingTone_Items> ringtonelist) {
this.rcntx = rcntx;
this.ringtonelist = ringtonelist;
}
#NonNull
#Override
public RingToneViewHolder onCreateViewHolder(#NonNull ViewGroup viewGroup, int i) {
view = LayoutInflater.from(rcntx).inflate(R.layout.ringtone_values, viewGroup, false);
RingToneViewHolder ringToneViewHolder = new RingToneViewHolder(view);
return ringToneViewHolder;
}
#Override
public void onBindViewHolder(#NonNull final RingToneViewHolder ringToneViewHolder, final int i) {
final RingTone_Items ringTone_items = ringtonelist.get(i);
ringToneViewHolder.rtv.setText(ringTone_items.getRintonetv());
if (mSelectedItem == i) { // mSelectedItem = -1 and at 1st time
// there is no position selected...so the condition goes false...go
// to else condtion
ringToneViewHolder.iconplay.setImageResource(R.drawable.ic_pause_black_24dp);
} else {
ringToneViewHolder.iconplay.setImageResource(R.drawable.ic_play_arrow_black_24dp); // all icons will show play icon
}
ringToneViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
// MyCustomAlertDialog(i);
if (mp != null && mp.isPlaying()) {
mp.stop();
mp.reset();
mp = null;
ringToneViewHolder.iconplay.setImageResource(R.drawable.ic_play_arrow_black_24dp);
}
//Intent it = new Intent(rcntx, ViewPager_Data.class);
Intent it = new Intent(rcntx, AndroidViewPagerExample.class);
it.putExtra("POS",i);
it.putExtra("name",ringTone_items.getRintonetv());
// mInterstitialAd = new InterstitialAd(rcntx);
// mInterstitialAd.setAdUnitId(rcntx.getResources().getString(R.string.ad_interstitial));
// AdRequest adRequest = new AdRequest.Builder().build();
// mInterstitialAd.loadAd(adRequest);
// mInterstitialAd.setAdListener(new AdListener() {
// public void onAdLoaded() {
// if (mInterstitialAd.isLoaded()) {
// mInterstitialAd.show();
// }
// }
// });
rcntx.startActivity(it);
}
});
ringToneViewHolder.iconplay.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
if (mSelectedItem == i) {
mSelectedItem = -1;
oldpossssssss = i;
} else {
mSelectedItem = i;
}
notifyDataSetChanged(); //update the position of row...notifyDataSetChanged is bindview method
if (mp != null && mp.isPlaying()) {
mp.stop();
//mp.deselectTrack(resID[i]);
mp.reset();
mp.release();
mp = null;
if (oldpossssssss == i) {
} else {
mp = new MediaPlayer();
mp = MediaPlayer.create(rcntx, resID[i]);
mp.start();
}
} else {
// MyCustomAlertDialog(i);
mp = new MediaPlayer();
mp = MediaPlayer.create(rcntx, resID[i]);
mp.start();
}
}
});
}
#Override
public int getItemCount() {
return ringtonelist.size();
}
class RingToneViewHolder extends RecyclerView.ViewHolder {
private TextView rtv, hello, close;
private ImageView iconplay;
public RingToneViewHolder(#NonNull View itemView) {
super(itemView);
rtv = itemView.findViewById(R.id.ringtitle);
iconplay = itemView.findViewById(R.id.playicon);
}
}
public void InterstitialAdmob() {
mInterstitialAd = new InterstitialAd(rcntx);
mInterstitialAd.setAdUnitId(rcntx.getResources().getString(R.string.ad_interstitial));
mInterstitialAd.setAdListener(new AdListener() {
#Override
public void onAdClosed() {
requestNewInterstitial();
}
});
requestNewInterstitial();
}
protected void requestNewInterstitial() {
AdRequest adRequest = new AdRequest.Builder().build();
mInterstitialAd.loadAd(adRequest);
}
}
here is main activity code
public class MainActivity extends AppCompatActivity {
RecyclerView recyclerView;
RingToneAdapter adapter;
public static ArrayList<RingTone_Items> ringtonelist;
//final int[] resID = {R.raw.alert};
public static int posss;
private String[] fruitlist = new String[]{"Funny hen 1", "Funny hen 2", "Funny roaster 1", "Funny roaster 2","Funny roaster 3", "Funny roaster 4", "funny roaster 5","Funny cock", "Funny hen alarm","Abstracts", "Wake up", "Funny tone","Get up","Alarm","Hen sound 1","Hen sound 2","Hen sound 3","Hen sound 4","Hen sound 5","Hen sound 6"};
private boolean isFABOpen;
FloatingActionButton fab,fab1, fab3;
FrameLayout fab2;
AdView mAdView;
RelativeLayout layout_no, layoutrateus, layout_yes, adlayout, adlayout1;
private static final int PERMISSION_REQUEST_CODE = 1;
private String fNmae = String.valueOf(R.raw.alarm);
private String fPAth = "android.resource://packagename/raw/alarm";
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recycler);
// Here, thisActivity is the current activity
if (Build.VERSION.SDK_INT >= 23) {
if (checkPermission()) {
if (Settings.System.canWrite(MainActivity.this)) {
//setRingtone();
} else {
Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS)
.setData(Uri.parse("package:" + getPackageName()))
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
Log.e("value", "Permission already Granted, Now you can save image.");
} else {
requestPermission();
}
} else {
// setRingtone();
Log.e("value", "Not required for requesting runtime permission");
}
mAdView = (AdView) findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);
//recyclerView.setBackgroundColor(getResources().getColor(R.color.colorAccent));
recyclerView.setBackground(getResources().getDrawable(R.drawable.bg));
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
// RecyclerView.LayoutManager mLayoutManager =
// new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.HORIZONTAL, false);
ringtonelist = getRingTone_Items();
adapter = new RingToneAdapter(this, ringtonelist);
recyclerView.setAdapter(adapter);
recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), recyclerView, new RecyclerTouchListener.ClickListener() {
#Override
public void onClick(View view, int position) {
RingTone_Items itemrg = ringtonelist.get(position);
posss=position;
}
#Override
public void onLongClick(View view, int position) {
}
}));
}
protected boolean checkPermission() {
int result = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (result == PackageManager.PERMISSION_GRANTED) {
return true;
} else {
return false;
}
}
protected void requestPermission() {
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
Toast.makeText(MainActivity.this, "Write External Storage permission allows us to do store images. Please allow this permission in App Settings.", Toast.LENGTH_LONG).show();
} else {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE);
}
}
#Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case PERMISSION_REQUEST_CODE:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.e("value", "Permission Granted, Now you can save image .");
if (Build.VERSION.SDK_INT >= 23) {
if (Settings.System.canWrite(MainActivity.this)) {
// setRingtone();
} else {
Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS)
.setData(Uri.parse("package:" + getPackageName()))
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}
} else {
Log.e("value", "Permission Denied, You cannot save image.");
}
break;
}
}
private ArrayList<RingTone_Items> getRingTone_Items(){
ArrayList<RingTone_Items> list = new ArrayList<>();
for(int i = 0; i < 20; i++){
RingTone_Items model = new RingTone_Items();
model.setRintonetv(fruitlist[i]);
list.add(model);
}
return list;
}
public void onBackPressed(){
if (mp != null && mp.isPlaying()) {
mp.pause();
mp.stop();
mp.release();
mp = null;
}
onexit();
}
public void onexit() {
android.view.LayoutInflater layout1 = android.view.LayoutInflater.from(this);
View view1 = layout1.inflate(R.layout.backpress, null);
final RelativeLayout relativeLayout=(RelativeLayout) view1.findViewById(R.id.layout_top);
final AlertDialog.Builder gotoBuilder1 = new AlertDialog.Builder(this);
gotoBuilder1.setView(view1);
final AlertDialog gotoDialog1 = gotoBuilder1.create();
layout_no = view1.findViewById(R.id.layoutno);
layoutrateus = view1.findViewById(R.id.layoutrateus);
layout_yes = view1.findViewById(R.id.layout_yes);
layout_no.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
gotoDialog1.dismiss();
}
});
layoutrateus.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
Intent mintent = new Intent(Intent.ACTION_VIEW);
mintent.setData(android.net.Uri.parse("market://details?id="
+ getPackageName()));
startActivity(mintent);
} catch (Exception e1) {
try {
android.net.Uri uriUrl = android.net.Uri
.parse("https://market.android.com/details?id="
+ getPackageName());
Intent launchBrowser = new Intent(Intent.ACTION_VIEW,
uriUrl);
startActivity(launchBrowser);
} catch (Exception e2) {
android.widget.Toast.makeText(getApplicationContext(),
"No Application Found to open link",
android.widget.Toast.LENGTH_SHORT).show();
}
}
gotoDialog1.dismiss();
}
});
layout_yes.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
} catch (Exception e) {
}
gotoDialog1.dismiss();
finish();
}
});
gotoDialog1.getWindow().setLayout(android.view.ViewGroup.LayoutParams.MATCH_PARENT,
android.view.ViewGroup.LayoutParams.WRAP_CONTENT);
gotoDialog1.show();
}
public void onDestroy() {
super.onDestroy();
}
}
this is my fragment
public class Apples extends BaseFragment{
ImageView vpbtn;
MediaPlayer mp;
ImageView tvshare;
static String s;
static TextView rgtname;
int position = 0;
private ShareActionProvider mShareActionProvider;
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.apple, container, false);
vpbtn = (ImageView) v.findViewById(R.id.iconplaypause);
mAdView = (AdView) v.findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);
rgtname=v.findViewById(R.id.rgtname);
rgtname.setText(s);
tvshare=v.findViewById(R.id.tvshare);
fab = v.findViewById(R.id.fab);
fab1 = v.findViewById(R.id.frm1);
fab2 = v.findViewById(R.id.frm2);
fab3 = v.findViewById(R.id.frm3);
// Vp_Ringtoneplaybtn.Setrintones(fab,fab1,fab2,fab3);
// tvshare.setOnClickListener(new View.OnClickListener() {
// #Override
// public void onClick(View v) {
// Vp_Ringtoneplaybtn.shareapp();
// }
// });
Vp_Ringtoneplaybtn.shareapp(tvshare);
fab.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
if(!isFABOpen){
showFABMenu();
}else{
closeFABMenu();
}
}
});
Vp_Ringtoneplaybtn.Setrintones(fab1,fab2,fab3,position);
vpbtn.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
Vp_Ringtoneplaybtn.PlaySound( vpbtn, position);
}
});
return v;
}
public static Apples newInstance(String rgtvv) {
s=rgtvv;
Apples f16 = new Apples();
return f16;
}
#Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (this.isVisible()) {
// If we are becoming invisible, then...
if (!isVisibleToUser) {
Vp_Ringtoneplaybtn.Playstop();
vpbtn.setImageResource(R.drawable.ic_play_arrow_black_24dp);
} else {
// do what you like
}
}
}
#Override
public void onPause() {
super.onPause();
}
}
I have a Nested Scroll view and inside this, I have a Linear Layout that includes two recycler views. Now the problem is that the first recycler view is not expanding up to its full extent. i.e. there are 5 items in the first recycler view list but it is only showing the first item if I put wrap content. This should expand up to 5 items because of wrap content but it is not working. If I fixed the height to 200DP or 300dp then it started to show more items up to that height. However, I want to show all the items of the first recycler view and then when I scroll it should start second recycler view items after the first recycler view items end.
My layout is:
<?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>
Please Help. Where I did something wrong. I tried so many ways from internet but nothing is working. Here is a screenshot of the this screen
The LABEL latest bookings has 5 items but it is only showing one and not expanding up to 5 items. However the second LABEL Past bookings is working perfectly and showing all items when i scroll up to end.
My java file is:
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();
}
});
}
});
}
}
and activity_my_booking layout is:
<?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>
Set the first RecyclerView’s height to wrap_content and set setNestedScrollingEnabled to false
RecyclerView rv_ongoing_bookings= (RecyclerView) findViewById(R.id.rv_ongoing_bookings);
rv_ongoing_bookings.setNestedScrollingEnabled(false);
To achieve it my approach would be to customize my recyclerView adapter to act as a section header recycler view, something like this:
https://android-arsenal.com/details/1/4495
The following code will make recycler view expandable...
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;
}
}
Usage... use it the way you use recycler view...
just set recyclerView.setExpanded(true);
You may directly use it inside scrollview...
So, it's not really an answer to your question, it's more like a suggestion to use RecyclerView as it should be depending on the screenshot which you included in your question.
You really don't need to create two RecyclerView's to achieve the layout which you need. As I understand you want to show some items and put a separator with text depending on something (Booking's date as I can see).
In RecyclerView.Adapter you have getItemViewType where you can return an int value depending on some variables.For example your getItemViewType should look something like this:
#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;
}
Depending on those values you need to create two ViewHolder's :
#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 */);
}
And ->
#Override
public void onBindViewHolder(#NonNull RecyclerView.ViewHolder holder, int position) {
if (VIEW_TYPE_SEPARATOR == getItemViewType(position)) {
// Populate SeparatorViewHolder
} else {
// Populate BookingViewHolder
}
}
And at the end you should populate your List with the objects you need to determine if the item is a Booking item for example or a Separator.
I hope you got the main idea.
Basically i followed the accepted answer of this with few changes in my Activity and it worked perfect. My problem is that I wrote the exact same codes for my Fragment. when I open my app, it doesn't show anything. Before I changed my code in my fragment from a custom Adapter to the FirebaseRecyclerAdapter, everything worked fine.
This is my Fragment class
public class HomeFragment extends BaseFragment {
public Button buttonsrch, openFreezer, openRef, openPantry, scrollToFreezer, scrollToRef, scrollToPantry;
public NestedScrollView scrollView;
public RelativeLayout mFreezerLayout,mRefrigeratorLayout, mPantryLayout;
public FloatingActionButton mAddItems;
public DatabaseReference mDatabaseFreezer;
public RecyclerView mFreezerRecyclerView;
public ArrayList<Event> mDataSet;
private FirebaseRecyclerAdapter<Event, ProductHolder> firebaseRecyclerAdapter;
#Override
public int getLayoutResId() {
return R.layout.fragment_home;
}
#Override
public View inOnCreateView(View root, #Nullable ViewGroup container, Bundle savedInstancesState) {
View view = mRoot;
buttonsrch = view.findViewById(R.id.searchButton);
openPantry = view.findViewById(R.id.ShowMorePantry);
openRef = view.findViewById(R.id.ShowMoreRefrigerator);
openFreezer = view.findViewById(R.id.ShowMoreFreezer);
scrollToFreezer = view.findViewById(R.id.bringToFreezer);
scrollToPantry = view.findViewById(R.id.bringToPantry);
scrollToRef = view.findViewById(R.id.bringToRefrigerator);
scrollView = view.findViewById(R.id.scrollViewHomeFragment);
mFreezerLayout = view.findViewById(R.id.FreezerLayout);
mPantryLayout =view.findViewById(R.id.PantryRelativeLayout);
mRefrigeratorLayout = view.findViewById(R.id.RefrigeratorRelativeLayout);
mAddItems = view.findViewById(R.id.addItems_Inventory);
mAddItems.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
startActivity(new Intent(getActivity(), AddInventoryActivity.class));
}
});
buttonsrch.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
Intent i = new Intent(getActivity(), Search_Activity.class);
getActivity().startActivity(i);
}
});
openPantry.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
Intent h = new Intent(getActivity(), PantryActivity.class);
getActivity().startActivity(h);
}
});
openRef.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
Intent g = new Intent(getActivity(), RefActivity.class);
getActivity().startActivity(g);
}
});
openFreezer.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
Intent s = new Intent(getActivity(), FreezerActivity.class);
getActivity().startActivity(s);
}
});
scrollToFreezer.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
FocusToFreezer();
}
});
scrollToRef.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
FocusToRef();
}
});
scrollToPantry.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
FocusToPantry();
}
});
mDataSet = new ArrayList<>();
mFreezerRecyclerView = view.findViewById(R.id.FreezerRecyclerView);
mFreezerRecyclerView.setHasFixedSize(true);
mFreezerRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
mDatabaseFreezer = FirebaseDatabase.getInstance().getReference().child("FreezerItems");
Query query = mDatabaseFreezer;
FirebaseRecyclerOptions<Event> firebaseRecyclerOptions = new FirebaseRecyclerOptions.Builder<Event>()
.setQuery(query, Event.class).build();
firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Event, ProductHolder>(firebaseRecyclerOptions) {
#Override
protected void onBindViewHolder(ProductHolder holder, int position, Event model) {
model = mDataSet.get(position);
holder.mItemName.setText(model.getName());
holder.mItemDate.setText(model.getDate());
final Event finalModel = model;
holder.mDeleteBtn.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
mDatabaseFreezer.child(finalModel.get_id()).removeValue();
}
});
}
#Override
public ProductHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.recycler_view_row_inventory,parent,false);
return new ProductHolder(view);
}
};
mDatabaseFreezer.addChildEventListener(new ChildEventListener() {
#Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
HashMap<String, String> value = (HashMap<String,String>) dataSnapshot.getValue();
if (value != null) {
String name = value.get("Name");
String date = value.get("Date");
String key = value.get("Key");
mDataSet.add(new Event(name,date,null, key));
Collections.sort(mDataSet, new Comparator<Event>() {
#Override
public int compare(Event event, Event t1) {
if (event.getDate() == null || t1.getDate() == null)
return 0;
return event.getDate().compareTo(t1.getDate());
}
});
}
}
#Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
#Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
#Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
#Override
public void onCancelled(DatabaseError databaseError) {
}
});
mFreezerRecyclerView.setAdapter(firebaseRecyclerAdapter);
return root;
}
private class ProductHolder extends RecyclerView.ViewHolder{
private TextView mItemName, mItemDate;
private Button mDeleteBtn;
public ProductHolder(View itemView) {
super(itemView);
mItemName = itemView.findViewById(R.id.ItemNameTxtView);
mItemDate = itemView.findViewById(R.id.BestBeoforeTxtView);
mDeleteBtn = itemView.findViewById(R.id.deleteItem);
}
}
#Override
public void onStart() {
super.onStart();
firebaseRecyclerAdapter.startListening();
}
#Override
public void onStop() {
super.onStop();
if (firebaseRecyclerAdapter != null){
firebaseRecyclerAdapter.startListening();
}
}
private void FocusToFreezer(){
scrollView.post(new Runnable() {
#Override
public void run() {
scrollView.smoothScrollTo(0, mFreezerLayout.getTop());
}
});
}
private void FocusToRef(){
scrollView.post(new Runnable() {
#Override
public void run() {
scrollView.smoothScrollTo(0, mRefrigeratorLayout.getTop());
}
});
}
private void FocusToPantry(){
scrollView.post(new Runnable() {
#Override
public void run() {
scrollView.smoothScrollTo(0, mPantryLayout.getTop());
}
});
}
}
The only difference I could find is OnStart() and onStop() in activity are protected while on fragments are public
EDIT I found another page with the same problem and apparently FirebaseRecyclerAdapter doesn't work well with Fragments
I finally found an answer
simply remove mFreezerRecyclerView.setHasFixedSize(true);
I'm new to this concept. I read several threads but I block so thanks in advance for your patience!
In a fragment (frag1) I launch an async task. I want to prevent the user of doing anything while the task is not completed so I want to communicate the % of the task completed so the user waits informed.
I've defined an interface in a java SetVal.java:
interface SetVal {
void setVal(int val);
}
My async task:
class AsyncCounter extends AsyncTask<Void, Integer, Void> {
private SetVal sender;
public AsyncCounter(SetVal sv){
this.sender = sv;
}
#Override
protected Void doInBackground(Void... params) {
for(int i=0;i<60;i++){
publishProgress(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
#Override
protected void onProgressUpdate(Integer... values) {
Log.i("ASYNC TASK","val: "+values[0]);
sender.setVal(values[0]);
}
#Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
}
public interface SetVal {
public void setVal(int val);
}
public void setListener(SetVal listener) {
this.sender = listener;
}
}
I'm struggling to know how to pass the interface to the task.
Is my code correct?
How do I instantiate the async task?
fragment:
public class Frag1 extends android.app.Fragment implements SetVal {
private static TextView txt;
private int counter;
SetVal listener;
public Frag1() {
// Required empty public constructor
}
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_frag1, container, false);
}
#Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
txt = (TextView) getActivity().findViewById(R.id.txt);
Button btn = (Button) getActivity().findViewById(R.id.btn1);
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Log.i("Frag1", "val: " + counter);
if (counter > 0) return;
FragmentTransaction ft = getFragmentManager().beginTransaction();
Frag2 f2 = new Frag2();
ft.replace(R.id.content_frame, f2);
ft.addToBackStack("f2");
ft.commit();
}
});
Button btn2 = (Button) getActivity().findViewById(R.id.btn2);
btn2.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
AsyncCounter ac = new AsyncCounter(???????);
ac.execute();
}
});
}
#Override
public void setVal(int val) {
counter = val;
}
}
Not sure what and why you are trying to do that, but you can pass the Fragment :
Try to create a private method:
public void onClick(View v) {
startMyAsync();
}
private void startMyAsync() {
new AsyncCounter(this).execute();
}
finally:
public AsyncCounter(Frag1 context){
this.sender = (SetVal)context;
}
i want to query results from custom adapter by comparing query text with list in RecycleView, it successfully gets results from query then i make list of results and update the existing adapter but it does not effect anything, i use below code fot that
combinationMessagesList = createCombinationMessagesList();
combinationMessages = createCombinationMessagesList();
combinationMessages.clear();
for (int i = 0; i < combinationMessagesList.size(); i++) {
CombinationMessage message = combinationMessagesList.get(i);
if (message.getBody().toString().equals(search.getText().toString())){
combinationMessages.add(combinationMessagesList.get(i));
}
}
messagesAdapter.setList(combinationmessagesList);
messagesAdapter.notifyDataSetChanged();
}
PrivateDialogActivity
public class PrivateDialogActivity extends BaseDialogActivity {
private FriendOperationAction friendOperationAction;
private FriendObserver friendObserver;
private int operationItemPosition;
private final String TAG = "PrivateDialogActivity";
EditText search;
public static void start(Context context, User opponent, Dialog dialog) {
Intent intent = new Intent(context, PrivateDialogActivity.class);
intent.putExtra(QBServiceConsts.EXTRA_OPPONENT, opponent);
intent.putExtra(QBServiceConsts.EXTRA_DIALOG, dialog);
context.startActivity(intent);
}
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initFields();
context = this;
if (dialog == null) {
finish();
}
setUpActionBarWithUpButton();
if (isNetworkAvailable()) {
deleteTempMessages();
}
addObservers();
initMessagesRecyclerView();
search = (EditText) findViewById(R.id.search_edittext);
Button button = (Button) findViewById(R.id.search);
button.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
showResult();
}
});
}
private void showResult() {
combinationMessagesList = createCombinationMessagesList();
combinationMessages = createCombinationMessagesList();
combinationMessages.clear();
for (int i = 0; i < combinationMessagesList.size(); i++) {
CombinationMessage message = combinationMessagesList.get(i);
if (message.getBody().toString().equals(search.getText().toString())){
combinationMessages.add(combinationMessagesList.get(i));
}
}
messagesAdapter.setList(combinationMessagesList);
messagesAdapter.notifyDataSetChanged();
}
#Override
protected void addActions() {
super.addActions();
addAction(QBServiceConsts.ACCEPT_FRIEND_SUCCESS_ACTION, new AcceptFriendSuccessAction());
addAction(QBServiceConsts.ACCEPT_FRIEND_FAIL_ACTION, failAction);
addAction(QBServiceConsts.REJECT_FRIEND_SUCCESS_ACTION, new RejectFriendSuccessAction());
addAction(QBServiceConsts.REJECT_FRIEND_FAIL_ACTION, failAction);
updateBroadcastActionList();
}
#Override
protected void onResume() {
super.onResume();
checkForCorrectChat();
if (isNetworkAvailable()) {
startLoadDialogMessages();
}
checkMessageSendingPossibility();
}
#Override
protected void onDestroy() {
super.onDestroy();
deleteObservers();
}
#Override
protected void updateActionBar() {
setOnlineStatus(opponentUser);
checkActionBarLogo(opponentUser.getAvatar(), R.drawable.placeholder_user);
}
#Override
protected void onConnectServiceLocally(QBService service) {
onConnectServiceLocally();
setOnlineStatus(opponentUser);
}
#Override
protected void onFileLoaded(QBFile file, String dialogId) {
if(!dialogId.equals(dialog.getDialogId())){
return;
}
try {
privateChatHelper.sendPrivateMessageWithAttachImage(file, opponentUser.getUserId(), null, null);
} catch (QBResponseException exc) {
ErrorUtils.showError(this, exc);
}
}
#Override
protected Bundle generateBundleToInitDialog() {
Bundle bundle = new Bundle();
bundle.putInt(QBServiceConsts.EXTRA_OPPONENT_ID, opponentUser.getUserId());
return bundle;
}
#Override
protected void initMessagesRecyclerView() {
super.initMessagesRecyclerView();
messagesAdapter = new PrivateDialogMessagesAdapter(this, friendOperationAction, combinationMessagesList, this, dialog);
messagesRecyclerView.addItemDecoration(
new StickyRecyclerHeadersDecoration((StickyRecyclerHeadersAdapter) messagesAdapter));
findLastFriendsRequest();
messagesRecyclerView.setAdapter(messagesAdapter);
scrollMessagesToBottom();
}
#Override
protected void updateMessagesList() {
initActualExtras();
checkForCorrectChat();
int oldMessagesCount = messagesAdapter.getAllItems().size();
this.combinationMessagesList = createCombinationMessagesList();
Log.d(TAG, "combinationMessagesList = " + combinationMessagesList);
messagesAdapter.setList(combinationMessagesList);
findLastFriendsRequest();
checkForScrolling(oldMessagesCount);
}
private void initActualExtras() {
opponentUser = (User) getIntent().getExtras().getSerializable(QBServiceConsts.EXTRA_OPPONENT);
dialog = (Dialog) getIntent().getExtras().getSerializable(QBServiceConsts.EXTRA_DIALOG);
}
#Override
public void notifyChangedUserStatus(int userId, boolean online) {
super.notifyChangedUserStatus(userId, online);
if (opponentUser != null && opponentUser.getUserId() == userId) {
setOnlineStatus(opponentUser);
}
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.private_dialog_menu, menu);
return true;
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
boolean isFriend = DataManager.getInstance().getFriendDataManager().getByUserId(
opponentUser.getUserId()) != null;
if (!isFriend && item.getItemId() != android.R.id.home) {
ToastUtils.longToast(R.string.dialog_user_is_not_friend);
return true;
}
switch (item.getItemId()) {
case R.id.action_audio_call:
callToUser(opponentUser, QBRTCTypes.QBConferenceType.QB_CONFERENCE_TYPE_AUDIO);
break;
case R.id.switch_camera_toggle:
callToUser(opponentUser, QBRTCTypes.QBConferenceType.QB_CONFERENCE_TYPE_VIDEO);
break;
default:
super.onOptionsItemSelected(item);
}
return true;
}
#Override
protected void checkMessageSendingPossibility() {
boolean enable = dataManager.getFriendDataManager().existsByUserId(opponentUser.getUserId()) && isNetworkAvailable();
checkMessageSendingPossibility(enable);
}
#OnClick(R.id.toolbar)
void openProfile(View view) {
UserProfileActivity.start(this, opponentUser.getUserId());
}
private void initFields() {
chatHelperIdentifier = QBService.PRIVATE_CHAT_HELPER;
friendOperationAction = new FriendOperationAction();
friendObserver = new FriendObserver();
initActualExtras();
// opponentUser = (User) getIntent().getExtras().getSerializable(QBServiceConsts.EXTRA_OPPONENT);
// dialog = (Dialog) getIntent().getExtras().getSerializable(QBServiceConsts.EXTRA_DIALOG);
combinationMessagesList = createCombinationMessagesList();
title = opponentUser.getFullName();
}
private void addObservers() {
dataManager.getFriendDataManager().addObserver(friendObserver);
}
private void deleteObservers() {
dataManager.getFriendDataManager().deleteObserver(friendObserver);
}
private void findLastFriendsRequest() {
((PrivateDialogMessagesAdapter) messagesAdapter).findLastFriendsRequestMessagesPosition();
messagesAdapter.notifyDataSetChanged();
}
private void setOnlineStatus(User user) {
if (user != null) {
if (friendListHelper != null) {
String offlineStatus = getString(R.string.last_seen, DateUtils.toTodayYesterdayShortDateWithoutYear2(user.getLastLogin()),
DateUtils.formatDateSimpleTime(user.getLastLogin()));
setActionBarSubtitle(
OnlineStatusUtils.getOnlineStatus(this, friendListHelper.isUserOnline(user.getUserId()), offlineStatus));
}
}
}
public void sendMessage(View view) {
sendMessage(true);
}
private void callToUser(User user, QBRTCTypes.QBConferenceType qbConferenceType) {
if (!isChatInitializedAndUserLoggedIn()) {
ToastUtils.longToast(R.string.call_chat_service_is_initializing);
return;
}
List<QBUser> qbUserList = new ArrayList<>(1);
qbUserList.add(UserFriendUtils.createQbUser(user));
CallActivity.start(PrivateDialogActivity.this, qbUserList, qbConferenceType, null);
}
private void acceptUser(final int userId) {
if (isNetworkAvailable()) {
if (!isChatInitializedAndUserLoggedIn()) {
ToastUtils.longToast(R.string.call_chat_service_is_initializing);
return;
}
showProgress();
QBAcceptFriendCommand.start(this, userId);
} else {
ToastUtils.longToast(R.string.dlg_fail_connection);
return;
}
}
private void rejectUser(final int userId) {
if (isNetworkAvailable()) {
if (!isChatInitializedAndUserLoggedIn()) {
ToastUtils.longToast(R.string.call_chat_service_is_initializing);
return;
}
showRejectUserDialog(userId);
} else {
ToastUtils.longToast(R.string.dlg_fail_connection);
return;
}
}
private void showRejectUserDialog(final int userId) {
User user = DataManager.getInstance().getUserDataManager().get(userId);
if (user == null) {
return;
}
TwoButtonsDialogFragment.show(getSupportFragmentManager(),
getString(R.string.dialog_message_reject_friend, user.getFullName()),
new MaterialDialog.ButtonCallback() {
#Override
public void onPositive(MaterialDialog dialog) {
super.onPositive(dialog);
showProgress();
QBRejectFriendCommand.start(PrivateDialogActivity.this, userId);
}
});
}
private void checkForCorrectChat() {
Dialog updatedDialog = null;
if (dialog != null) {
updatedDialog = dataManager.getDialogDataManager().getByDialogId(dialog.getDialogId());
} else {
finish();
}
if (updatedDialog == null) {
finish();
} else {
dialog = updatedDialog;
}
}
private class FriendOperationAction implements FriendOperationListener {
#Override
public void onAcceptUserClicked(int position, int userId) {
operationItemPosition = position;
acceptUser(userId);
}
#Override
public void onRejectUserClicked(int position, int userId) {
operationItemPosition = position;
rejectUser(userId);
}
}
private class AcceptFriendSuccessAction implements Command {
#Override
public void execute(Bundle bundle) {
((PrivateDialogMessagesAdapter) messagesAdapter).clearLastRequestMessagePosition();
messagesAdapter.notifyItemChanged(operationItemPosition);
startLoadDialogMessages();
hideProgress();
}
}
private class RejectFriendSuccessAction implements Command {
#Override
public void execute(Bundle bundle) {
((PrivateDialogMessagesAdapter) messagesAdapter).clearLastRequestMessagePosition();
messagesAdapter.notifyItemChanged(operationItemPosition);
startLoadDialogMessages();
hideProgress();
}
}
private class FriendObserver implements Observer {
#Override
public void update(Observable observable, Object data) {
if (data != null && data.equals(FriendDataManager.OBSERVE_KEY)) {
checkForCorrectChat();
checkMessageSendingPossibility();
}
}
}
}
it was my own mistake it code, i made the code work by changing messagesAdapter.setList(combinationmessagesList)
to
messagesAdapter.setList(combinationMessages);