草庐IT

android - 为什么 RecyclerView 项目随着滚动而消失

coder 2023-12-20 原文

我在我的应用程序中使用了 RecyclerView,但是当我在我的 RecyclerView 上滚动时,我的项目将会消失!我将此代码用于很多 RecyclerView,但这次我不知道发生了什么。 有我的 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();
  }


}

这是我使用的适配器类:

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

我不明白我的元素怎么会消失! 如果你能帮助我,我真的很感激。 谢谢。

最佳答案

我遇到了同样的问题 ( https://github.com/square/picasso/issues/845 ) 但在 github 中发现了这个并且对我有用。感谢@raj9686

rv.getRecycledViewPool().setMaxRecycledViews(0, 0);

关于android - 为什么 RecyclerView 项目随着滚动而消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44230577/

有关android - 为什么 RecyclerView 项目随着滚动而消失的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  4. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  5. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  6. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  7. ruby - ruby 中的 TOPLEVEL_BINDING 是什么? - 2

    它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput

  8. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  9. ruby - Infinity 和 NaN 的类型是什么? - 2

    我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

  10. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

随机推荐