Why RecyclerView items disappear with scrolling

Viewed 10461

I am using a RecyclerView in my app but when I scroll on my RecyclerView my items will disappear! I used this code for a lot of RecyclerView but this time I don't know what is happening. there is my code for my Activity:

public class ActivityStartup extends AppCompatActivity {

  Toolbar toolbar;
  DrawerLayout drawerLayout;
  NavigationView navigationView;
  RecyclerView menuListRecycler;
  RecyclerView schedualRecycler;

  private List<ReminderModel> tempSchedualArray = new ArrayList<>();

  /**
   * ATTENTION: This was auto-generated to implement the App Indexing API.
   * See https://g.co/AppIndexing/AndroidStudio for more information.
   */
  private GoogleApiClient client;
  LinearLayoutManager mSchedualLayoutManager = new LinearLayoutManager(ActivityStartup.this);
  private FloatingActionButton mAddReminderButton;
  RecyclerView.Adapter mSchedualAdapter;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    toolbar = (Toolbar) findViewById(R.id.toolBar);
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    navigationView = (NavigationView) findViewById(R.id.navigationView);
    menuListRecycler = (RecyclerView) findViewById(R.id.menuList);
    schedualRecycler = (RecyclerView) findViewById(R.id.acitvityStartup_recycler_scheduals);

    //Setting Customized toolbar for application
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    LinearLayoutManager mEventsLayoutManager = new LinearLayoutManager(ActivityStartup.this);
    menuListRecycler.setLayoutManager(mEventsLayoutManager);
    RecyclerView.Adapter mEventsAdapter = new MenuAdapter(G.menuItems, ActivityStartup.this);
    menuListRecycler.setAdapter(mEventsAdapter);
    mAddReminderButton = (FloatingActionButton) findViewById(R.id.add_reminder);

    //Setting up recyclerView of events
    populateSchedualArray();

    schedualRecycler.setLayoutManager(mSchedualLayoutManager);
    mSchedualAdapter = new SchedualAdapter(populateSchedualArray(), ActivityStartup.this);
    schedualRecycler.setAdapter(mSchedualAdapter);

    // On clicking the floating action button
    mAddReminderButton.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        Intent intent = new Intent(v.getContext(), ReminderAddActivity.class);
        startActivity(intent);
      }
    });

  }

  @Override
  protected void onResume() {
    super.onResume();

    mSchedualAdapter = new SchedualAdapter(populateSchedualArray(), ActivityStartup.this);
    schedualRecycler.setAdapter(mSchedualAdapter);
  }



  private ArrayList<ReminderModel> populateSchedualArray() {

    ArrayList<ReminderModel> schedualArray = new ArrayList<>();

    Database rb = new Database(ActivityStartup.this);
    tempSchedualArray = rb.getAllReminders();

    ArrayList<ReminderModel> monthOne = new ArrayList<>();
    ArrayList<ReminderModel> monthTwo = new ArrayList<>();
    ArrayList<ReminderModel> monthThree = new ArrayList<>();
    ArrayList<ReminderModel> monthFour = new ArrayList<>();
    ArrayList<ReminderModel> monthFive = new ArrayList<>();
    ArrayList<ReminderModel> monthSix = new ArrayList<>();
    ArrayList<ReminderModel> monthSeven = new ArrayList<>();
    ArrayList<ReminderModel> monthEight = new ArrayList<>();
    ArrayList<ReminderModel> monthNine = new ArrayList<>();
    ArrayList<ReminderModel> monthTen = new ArrayList<>();
    ArrayList<ReminderModel> monthEleven = new ArrayList<>();
    ArrayList<ReminderModel> monthTwelve = new ArrayList<>();

    for (ReminderModel rm : tempSchedualArray) {

      String[] split = rm.getDate().split("/");
      switch (split[1]) {
        case "1":
          rm.setDate(convertDateToGregorian(split[2], split[1], split[0]));
          monthOne.add(rm);
          break;
        case "2":
          rm.setDate(convertDateToGregorian(split[2], split[1], split[0]));
          monthTwo.add(rm);
          break;
        case "3":
          rm.setDate(convertDateToGregorian(split[2], split[1], split[0]));
          monthThree.add(rm);
          break;
        case "4":
          rm.setDate(convertDateToGregorian(split[2], split[1], split[0]));
          monthFour.add(rm);
          break;
        case "5":
          rm.setDate(convertDateToGregorian(split[2], split[1], split[0]));
          monthFive.add(rm);
          break;
        case "6":
          rm.setDate(convertDateToGregorian(split[2], split[1], split[0]));
          monthSix.add(rm);
          break;
        case "7":
          rm.setDate(convertDateToGregorian(split[2], split[1], split[0]));
          monthSeven.add(rm);
          break;
        case "8":
          rm.setDate(convertDateToGregorian(split[2], split[1], split[0]));
          monthEight.add(rm);
          break;
        case "9":
          rm.setDate(convertDateToGregorian(split[2], split[1], split[0]));
          monthNine.add(rm);
          break;
        case "10":
          rm.setDate(convertDateToGregorian(split[2], split[1], split[0]));
          monthTen.add(rm);
          break;
        case "11":
          rm.setDate(convertDateToGregorian(split[2], split[1], split[0]));
          monthEleven.add(rm);
          break;
        case "12":
          rm.setDate(convertDateToGregorian(split[2], split[1], split[0]));
          monthTwelve.add(rm);
          break;
      }


    }

    schedualArray.add(new ReminderModel(100000001, "start_spring", "", "", "", "", "", ""));
    schedualArray.addAll(monthOne);
    schedualArray.addAll(monthTwo);
    schedualArray.addAll(monthThree);
    schedualArray.add(new ReminderModel(100000004, "start_summer", "", "", "", "", "", ""));
    schedualArray.addAll(monthFour);
    schedualArray.addAll(monthFive);
    schedualArray.addAll(monthSix);
    schedualArray.add(new ReminderModel(100000007, "start_fall", "", "", "", "", "", ""));
    schedualArray.addAll(monthSeven);
    schedualArray.addAll(monthEight);
    schedualArray.addAll(monthNine);
    schedualArray.add(new ReminderModel(1000000010, "start_winter", "", "", "", "", "", ""));
    schedualArray.addAll(monthTen);
    schedualArray.addAll(monthEleven);
    schedualArray.addAll(monthTwelve);

    return schedualArray;
  }

  private String convertDateToGregorian(String year, String month, String day) {

    CalendarTool calendarTool = new CalendarTool();
    calendarTool.setIranianDate(Integer.parseInt(year), Integer.parseInt(month), Integer.parseInt(day));

    return calendarTool.getGregorianYear() + "/" + calendarTool.getGregorianMonth() + "/" + calendarTool.getGregorianDay();
  }


  @Override
  public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();

    if (id == android.R.id.home) {
      Toast.makeText(this, "دکمه خانه کلیک شد !", Toast.LENGTH_SHORT).show();
    }
    if (id == R.id.action_settings) {
      drawerLayout.openDrawer(Gravity.RIGHT);
      return true;
    }
    return super.onOptionsItemSelected(item);
  }

  /**
   * ATTENTION: This was auto-generated to implement the App Indexing API.
   * See https://g.co/AppIndexing/AndroidStudio for more information.
   */
  public Action getIndexApiAction() {
    Thing object = new Thing.Builder()
      .setName("Main Page") // TODO: Define a title for the content shown.
      // TODO: Make sure this auto-generated URL is correct.
      .setUrl(Uri.parse("http://[ENTER-YOUR-URL-HERE]"))
      .build();
    return new Action.Builder(Action.TYPE_VIEW)
      .setObject(object)
      .setActionStatus(Action.STATUS_TYPE_COMPLETED)
      .build();
  }

  @Override
  public void onStart() {
    super.onStart();
  }

  @Override
  public void onStop() {
    super.onStop();
  }


}

and this is my adapter class that i used :

public class SchedualAdapter extends RecyclerView.Adapter<SchedualAdapter.ViewHolder> {
  private ArrayList<ReminderModel> items;
  private Context mContext;


  public SchedualAdapter(ArrayList<ReminderModel> items, Context mContext) {
    this.items = items;
    this.mContext = mContext;
  }

  public static class ViewHolder extends RecyclerView.ViewHolder {

    TextView txtDateNumber;
    TextView txtDateName;
    TextView txtEventTitle;
    TextView txtMonthName;
    ImageView imgMonth;
    LinearLayout layoutTop;

    public ViewHolder(View v) {
      super(v);

      txtDateNumber = (TextView) v.findViewById(R.id.txt_dateNumber);
      txtDateName = (TextView) v.findViewById(R.id.txt_dateName);
      txtEventTitle = (TextView) v.findViewById(R.id.txt_eventTitle);
      txtMonthName = (TextView) v.findViewById(R.id.txt_monthName);
      imgMonth = (ImageView) v.findViewById(R.id.img_monthPic);
      layoutTop = (LinearLayout) v.findViewById(R.id.layoutTop);
    }
  }

  @Override
  public SchedualAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    // Create a new View
    final View v = LayoutInflater.from(mContext).inflate(R.layout.schedual_recycler_item, parent, false);
    ViewHolder vh = new ViewHolder(v);
    return vh;
  }

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

    if (items.get(position).getTitle().equals("start_spring")) {

      holder.imgMonth.setVisibility(View.VISIBLE);
      holder.imgMonth.setImageResource(R.drawable.spring);
      holder.txtDateName.setVisibility(View.GONE);
      holder.txtDateNumber.setVisibility(View.GONE);
      holder.txtEventTitle.setVisibility(View.GONE);
    } else if (items.get(position).getTitle().equals("start_summer")) {
      holder.imgMonth.setVisibility(View.VISIBLE);
      holder.imgMonth.setImageResource(R.drawable.summer);
      holder.txtDateName.setVisibility(View.GONE);
      holder.txtDateNumber.setVisibility(View.GONE);
      holder.txtEventTitle.setVisibility(View.GONE);
    } else if (items.get(position).getTitle().equals("start_fall")) {
      holder.imgMonth.setVisibility(View.VISIBLE);
      holder.imgMonth.setImageResource(R.drawable.fall);
      holder.txtDateName.setVisibility(View.GONE);
      holder.txtDateNumber.setVisibility(View.GONE);
      holder.txtEventTitle.setVisibility(View.GONE);
    } else if (items.get(position).getTitle().equals("start_winter")) {
      holder.imgMonth.setVisibility(View.VISIBLE);
      holder.imgMonth.setImageResource(R.drawable.winter);
      holder.txtDateName.setVisibility(View.GONE);
      holder.txtDateNumber.setVisibility(View.GONE);
      holder.txtEventTitle.setVisibility(View.GONE);
    } else {

      holder.imgMonth.setVisibility(View.GONE);

      holder.layoutTop.setVisibility(View.VISIBLE);
      holder.txtEventTitle.setText(items.get(position).getTitle());
      holder.txtDateNumber.setText(items.get(position).getDate());

      CalendarTool c = new CalendarTool();

      if (!items.get(position).getDate().equals("")) {

        String[] split = items.get(position).getDate().split("/");
        c.setIranianDate(Integer.parseInt(split[2]), Integer.parseInt(split[1]), Integer.parseInt(split[0]));
        holder.txtDateName.setText("" + c.getDayOfWeek());
      }

    }


    setAnimation(holder.itemView, position);

  }

  private int lastPosition = -1;

  private void setAnimation(View viewToAnimate, int position) {
    // If the bound view wasn't previously displayed on screen, it's animated
    if (position > lastPosition) {
      ScaleAnimation anim = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
      anim.setDuration(new Random().nextInt(501));//to make duration random number between [0,501)
      viewToAnimate.startAnimation(anim);
      lastPosition = position;
    }
  }

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

I can't understand how my items will disappear! I really appreciate it if you can help me. thank you.

6 Answers

check the layout of the recycler item

android:layout_height="wrap_content"

To hide certain views with multiple items, it is better to hide the base layout by,

1. Give an id to the base layout of the view in XML. 
2. Define the view inside your "RecyclerViewAdapter class"
LinearLayout mItems_timelineId;
mItems_timelineId = itemView.findViewById(R.id.items_timelineId);
3. Then remove the view wherever you wish to by,
mItems_timelineId.removeAllViews();

This is worked for me. Thank you.

Related