タッチフリーデバイスにRecyclerView
グリッドのリストセレクタを実装しようとしています。私の実装は正常に動作しますが、効率的なパフォーマンスが得られないnotifyItemChanged()
メソッドが必要です。私はアイテムの100sのグリッドを持っているので、もし私が高速にスクロールすると(キーボードとスクロールしてonKey)、グリッドはたくさんのアイテムが更新されてゆきます。これを避ける方法はありますか?タッチフリーデバイスのRecyclerViewのListSelector(onKeyリスナーを使用)
活動
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;
}