gpt4 book ai didi

android - 免触摸设备上 RecyclerView 的 ListSelector(使用 onKey 监听器)

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:01:30 26 4
gpt4 key购买 nike

我正在尝试在免触摸设备上为我的 RecyclerView 网格实现一个列表选择器。我的实现工作正常,但它需要 notifyItemChanged() 方法,这在性能方面并不高效。我有一个包含 100 多个项目的网格,所以如果我快速滚动(使用键盘滚动,因此使用 onKey),随着大量项目的更新,网格会变得扭曲。有没有办法避免这种情况?

Activity

mRecyclerView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
RecyclerView.LayoutManager lm = mRecyclerView.getLayoutManager();

if (event.getAction() == KeyEvent.ACTION_DOWN) {
switch (keyCode) {
case Constants.KEYCODE_UP:
return moveSelection(lm, -1, true);

case Constants.KEYCODE_DOWN:
return moveSelection(lm, 1, true);
}
}
return false;
}
});

public boolean moveSelection(RecyclerView.LayoutManager lm, int direction, boolean verticalMovement) {
...
//just calculate the position to move to and pass it to selectedPosition
return mAdapter.tryMoveSelection(lm, selectedPosition);
}

适配器

 @Override
public void onBindViewHolder(ViewHolder holder, int position) {
// - get element from your dataset at this position
// - replace the contents of the view with that element
mViewHolder = holder;

holder.itemView.setSelected(mFocusedItem == position);
...
}

public boolean tryMoveSelection(RecyclerView.LayoutManager lm, int selectedPosition) {
notifyItemChanged(mFocusedItem);
mFocusedItem = selectedPosition;
notifyItemChanged(mFocusedItem);
lm.scrollToPosition(mFocusedItem);
return true;
}

最佳答案

您可以在代码中添加一些优化:

  1. RecyclerView 时不要调用 notifyItemChanged()正在滚动。有几个方便的方法:

  2. getScrollState()SCROLL_STATE_IDLE然后调用 notifyItemChanged()

  3. Adapter 还有一些方便的方法可以覆盖:

关于android - 免触摸设备上 RecyclerView 的 ListSelector(使用 onKey 监听器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39656860/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com