【问题标题】:My RecyclerView is lagging despite not having any listeners + imageViews, why is that?尽管没有任何侦听器 + imageViews,但我的 RecyclerView 仍然滞后,这是为什么呢?
【发布时间】:2016-10-07 01:37:10
【问题描述】:

首先,我读过其他与我有同样问题的帖子;从我的总结来看,问题通常是因为 imageviews/pictures + listeners。但这不是我的情况。我什至没有为我的delButtonaddButton 创建听众,而且我仍然落后。

我打算做什么: https://gyazo.com/ff984e87fc11543d44d1b549147f870c

只要点击添加按钮,就会创建一个新的listRow

这是我的 RecyclerVIew 课程:

public class RecyclerAdapter extends RecyclerView.Adapter {

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.saved_list_layout, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        ((ViewHolder) holder).bindView(position);
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder{
        TextView mListTextView;

        public ViewHolder(View itemView) {
            super(itemView);
            mListTextView = (TextView) itemView.findViewById(R.id.currentLIst);
        }

        public void bindView(int position){
            mListTextView.setText("List # " + position);
        }
    }

}

这是我的活动课

    public class SavedLists extends AppCompatActivity {
       // private yourListNumber[] mHoles = new yourListNumber[0];
        public static final ArrayList<ListRow> mListRow  = new ArrayList<ListRow>();
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_saved_lists);
            Button mButton = (Button) findViewById(R.id.addList);



            //RECYCLERADAPTER set-up here:
            final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
            final RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
            recyclerView.setLayoutManager(layoutManager);
            recyclerView.setAdapter(new RecyclerAdapter());

            mButton.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v){
                    mListRow.add(new ListRow());

                    recyclerView.setLayoutManager(layoutManager);
                    recyclerView.setAdapter(new RecyclerAdapter());
                    //instead of repeating these 3 lines of code, you can use refresh
                }
            });
        }
    }

【问题讨论】:

    标签: android performance android-recyclerview performance-testing


    【解决方案1】:

    这是因为您总是在单击按钮时重置 recyclerView 适配器。 把onClick监听改成这样

    mButton.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){
            mListRow.add(new ListRow());
    
            recyclerView.notifyDataSetChanged();
        }
    });
    

    【讨论】:

      【解决方案2】:

      为什么要从 bindViewolder 调用 viewholders 方法?改成这样

      public class RecyclerAdapter extends RecyclerView.Adapter {
      ArrayList<ListRow> adapterListData;
      
       @Override
       public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
      
         public void RecyclerAdapter(ArrayList<ListRow> mListRow){
          adapterListData = mListRow;
         }
      
          View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.saved_list_layout, parent, false);
          return new ViewHolder(view);
      }
      
      @Override
      public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            holder.mListTextView.setText("List # " + adapterListData.get(position));
      
      }
      
      @Override
      public int getItemCount() {
          return adapterListData.size();
      }
      
      public class ViewHolder extends RecyclerView.ViewHolder{
          TextView mListTextView;
      
          public ViewHolder(View itemView) {
              super(itemView);
              mListTextView = (TextView) itemView.findViewById(R.id.currentLIst);
          }
      }
      

      }

      并且不要在活动中设置回收器适配器两次。并在构造函数中传递您的数据并将其分配给全局变量

      public class SavedLists extends AppCompatActivity {
         // private yourListNumber[] mHoles = new yourListNumber[0];
          public static final ArrayList<ListRow> mListRow  = new ArrayList<ListRow>();
           RecyclerAdapter mAdapter;
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_saved_lists);
              Button mButton = (Button) findViewById(R.id.addList);
      
      
      
              //RECYCLERADAPTER set-up here:
              final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
              final RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
              recyclerView.setLayoutManager(layoutManager);
              mAdapter  = new RecyclerAdapter(mListRow);
              recyclerView.setAdapter(mAdapter);
      
              mButton.setOnClickListener(new View.OnClickListener(){
                  @Override
                  public void onClick(View v){
                      mListRow.add(new ListRow());
                      mAdapter.notifyDataSetChanged();
                  }
              });
          }
      }
      

      【讨论】:

      • 谢谢约翰!这提高了性能,但仍然滞后,还有其他想法吗?
      猜你喜欢
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 2020-11-12
      • 1970-01-01
      • 2016-02-11
      • 2015-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多