我基于创建列表和卡片指南创建了RecyclerView示例.我的适配器只有一个模式实现来扩展布局.
问题是滚动性能差.这在RecycleView中只有8个项目.
在一些测试中我验证了在Android L中没有出现这个问题.但在KitKat版本中,性能的下降是显而易见的.
java performance android recycler-adapter android-recyclerview
当我滚动它时,我的 recyclerview 正在复制项目并且我已经在调用adapter.notifyDataSetChanged().
所以,可能我在错误的地方调用了数据集更新,但我找不到它是如何工作的。
这是一些代码:
RecyclerView packageRecyclerView;
Intent intent;
ChecklistAdapter recyclerViewAdapter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_checklist);
intent = getIntent();
size = intent.getIntExtra("size", 0);
Log.d(TAG, "onCreate - Qtd Questões: " + size);
packageRecyclerView = findViewById(R.id.package_lst);
LinearLayoutManager recyclerLayoutManager = new LinearLayoutManager(this);
packageRecyclerView.setLayoutManager(recyclerLayoutManager);
DividerItemDecoration dividerItemDecoration =
new DividerItemDecoration(packageRecyclerView.getContext(),
recyclerLayoutManager.getOrientation());
packageRecyclerView.addItemDecoration(dividerItemDecoration);
List<Checklist> modelList = new ArrayList<>();
recyclerViewAdapter = new ChecklistAdapter(modelList,this);
modelList = getPackages();
recyclerViewAdapter = new ChecklistAdapter(modelList,this);
// recyclerViewAdapter = new ChecklistAdapter(getPackages(),this);
packageRecyclerView.setAdapter(recyclerViewAdapter);
}
private List<Checklist> getPackages() { …Run Code Online (Sandbox Code Playgroud) 我的应用程序中出现以下错误:
java.lang.IllegalStateException: Two different ViewHolders have the same stable ID. Stable IDs in your adapter MUST BE unique and SHOULD NOT change.
ViewHolder 1:ViewHolder{c7b44d1 position=5 id=3, oldPos=-1, pLpos:-1 not recyclable(1)}
View Holder 2:ViewHolder{67232f6 position=3 id=3, oldPos=-1, pLpos:-1}
Run Code Online (Sandbox Code Playgroud)
我正在使用 Mike @github 的 MaterialDrawer,这是我的视图示例:
public class FavoritesViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
TextView Title;
ImageView Pic;
public FavoritesViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
Title = (TextView) itemView.findViewById(R.id.textViewHighlight);
Pic = (ImageView) itemView.findViewById(R.id.imageViewHighlight);
}
}
Run Code Online (Sandbox Code Playgroud)
两个片段正在切换它们的布局,当我按下第一个片段时,它加载没有任何问题,当我按下第二个片段时,它加载不同的布局和 FC 本身。
两个片段使用相同的 ViewHolder 代码,但在不同的类中。