SelectionTracker не выбирает ничего в моем Recyclerview

Я сделал несколько экспериментов над ним и обнаружил, что R всегда копирует объект под первой модификацией.

Вы можете увидеть результат на моей машине в http://rpubs.com/ wash978 / 5916

Пожалуйста, дайте мне знать, если я сделал какую-либо ошибку, спасибо.


Чтобы проверить, скопирован ли объект или нет

Я выгружаю адрес памяти со следующим кодом C:

#define USE_RINTERNALS
#include 
#include 

SEXP dump_address(SEXP src) {
  Rprintf("%16p %16p %d\n", &(src->u), INTEGER(src), INTEGER(src) - (int*)&(src->u));
  return R_NilValue;
}

Он выведет 2 адреса:

  • Адрес блока данных SEXP
  • Адрес непрерывного блока integer

Давайте скомпилируем и загрузим эту функцию C.

Rcpp:::SHLIB("dump_address.c")
dyn.load("dump_address.so")

Информация о сеансе

Здесь sessionInfo тестовой среды.

sessionInfo()

Копировать при записи

Сначала я проверяю свойство копии при записи , что R только копирует объект только при его изменении.

a <- 1L
b <- a
invisible(.Call("dump_address", a))
invisible(.Call("dump_address", b))
b <- b + 1
invisible(.Call("dump_address", b))

Объект b копирует с a при модификации. R реализует свойство copy on write.

Измените вектор / матрицу на месте

Затем я проверю, будет ли R копировать объект, когда мы модифицируем элемент вектора / матрицы.

Вектор с длиной 1

a <- 1L
invisible(.Call("dump_address", a))
a <- 1L
invisible(.Call("dump_address", a))
a[1] <- 1L
invisible(.Call("dump_address", a))
a <- 2L 
invisible(.Call("dump_address", a))

Адрес меняется каждый раз, что означает, что R не использует повторно память.

Длинный вектор

system.time(a <- rep(1L, 10^7))
invisible(.Call("dump_address", a))
system.time(a[1] <- 1L)
invisible(.Call("dump_address", a))
system.time(a[1] <- 1L)
invisible(.Call("dump_address", a))
system.time(a[1] <- 2L)
invisible(.Call("dump_address", a))

Для длинного вектора R повторно использовать память после первой модификации.

Кроме того, приведенный выше пример также показывает, что «изменение на месте» влияет на производительность, когда объект огромен.

Матрица

system.time(a <- matrix(0L, 3162, 3162))
invisible(.Call("dump_address", a))
system.time(a[1,1] <- 0L)
invisible(.Call("dump_address", a))
system.time(a[1,1] <- 1L)
invisible(.Call("dump_address", a))
system.time(a[1] <- 2L)
invisible(.Call("dump_address", a))
system.time(a[1] <- 2L)
invisible(.Call("dump_address", a))

Кажется, что R копирует объект только при первых модификациях.

Не знаю, почему.

Изменение attribute

system.time(a <- vector("integer", 10^2))
invisible(.Call("dump_address", a))
system.time(names(a) <- paste(1:(10^2)))
invisible(.Call("dump_address", a))
system.time(names(a) <- paste(1:(10^2)))
invisible(.Call("dump_address", a))
system.time(names(a) <- paste(1:(10^2) + 1))
invisible(.Call("dump_address", a))

Результат тот же. R только копирует объект при первой модификации.

0
задан Radek Daniluk 10 March 2019 в 00:14
поделиться

1 ответ

вместо этого вам просто нужно добавить прослушиватель щелчка при создании держателя вида:

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {

    val myViewHolder = MyViewHolder(
        LayoutInflater.from(context)
            .inflate(R.layout.list_item_jf, parent, false)
    )
    myViewHolder.setOnClickListener {
        // Add what you what you need here
    }
    return myViewHolder
}
0
ответ дан Khaled Qasem 10 March 2019 в 00:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: