Вам нужно разделить взаимодействия onBindViewHolder (логические) с CheckBox и взаимодействия с пользователем с помощью флажка. Я использовал OnCheckedChangeListener для пользовательских взаимодействий (очевидно) и ViewHolder.bind () для логики, поэтому вам нужно установить проверенный прослушиватель на нуль до настройки держателя и после того, как владелец готов - настроить проверочный прослушиватель для пользовательских взаимодействий.
boolean[] checkedStatus = new boolean[numberOfRows];
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
final ViewHolderItem itemHolder = (ViewHolderItem) holder;
//holder.bind should not trigger onCheckedChanged, it should just update UI
itemHolder.checkBox.setOnCheckedChangeListener(null);
itemHolder.bind(position);
itemHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
checkedStatus[holder.getAdapterPosition()] = true;
performCheckedActions(); //your logic here
} else {
checkedStatus[holder.getAdapterPosition()] = false;
performUncheckedActions(); //your logic here
}
}
});
}
public void bind(int position) {
boolean checked = checkedStatus[position];
if (checked) {
checkBox.setChecked(false);
} else {
checkBox.setChecked(true);
}
}
Вы можете использовать apply
после изменения данных в нужные размеры: например:
i=nrow(dfs[[1]])
j=ncol(dfs[[1]])
k=length(dfs)
apply(array(unlist(dfs),c(i,j,k)),c(1,2),sum)
[,1] [,2] [,3] [,4]
[1,] 29.3 15.7 17.6 5.3
[2,] 29.1 16.3 18.3 6.4
[3,] 27.9 15.1 15.6 4.4
, если вы хотите, чтобы среднее:
apply(array(unlist(dfs),c(i,j,k)),c(1,2),mean)
[,1] [,2] [,3] [,4]
[1,] 5.86 3.14 3.52 1.06
[2,] 5.82 3.26 3.66 1.28
[3,] 5.58 3.02 3.12 0.88
, если вы хотите max
:
apply(array(unlist(dfs),c(i,j,k)),c(1,2),max)
[,1] [,2] [,3] [,4]
[1,] 7.2 3.6 6.1 2.5
[2,] 6.9 3.8 5.7 2.3
[3,] 6.1 3.5 4.9 1.8
Вы можете выполнить любую функцию, которая возвращает итоговое значение
data.frame(apply(array(unlist(dfs),c(i,j,k)),c(1,2),paste0,collapse=","))
X1 X2 X3 X4
1 4.8,7.2,6,6.4,4.9 3.1,3.6,2.2,3.2,3.6 1.6,6.1,4,4.5,1.4 0.2,2.5,1,1.5,0.1
2 4.6,6.9,5.8,5.1,6.7 3.6,3.2,2.7,3.8,3 1,5.7,5.1,1.5,5 0.2,2.3,1.9,0.3,1.7
3 4.8,5.8,5.5,6.1,5.7 3.4,2.6,3.5,3,2.6 1.9,4,1.3,4.9,3.5 0.2,1.2,0.2,1.8,1
Вы можете использовать Reduce
:
Reduce(`+`, dfs)
# Sepal.Length Sepal.Width Petal.Length Petal.Width
# 122 28.0 13.2 18.7 6.1
# 87 26.8 14.9 15.1 4.5
# 100 30.8 14.6 23.1 7.7
В этом случае это просто, потому что +
добавляет элемент lhs и rhs мудрый, с векторизованными функциями (например, paste
) вы можете использовать:
data.frame(Reduce(function(x,y) Map(paste,x,y), dfs))
# Sepal.Length Sepal.Width Petal.Length Petal.Width
# 1 5.6 6.2 5 5.2 6 2.8 2.2 3.3 2.7 2.2 4.9 4.5 1.4 3.9 4 2 1.5 0.2 1.4 1
# 2 6.7 4.6 4.6 5.9 5 3.1 3.4 3.1 3 2.3 4.7 1.4 1.5 4.2 3.3 1.5 0.3 0.2 1.5 1
# 3 5.7 5.8 6.7 6.1 6.5 2.8 2.7 3.3 3 2.8 4.1 4.1 5.7 4.6 4.6 1.3 1 2.5 1.4 1.5
данных
dfs<-list()
for (i in 1:5) {
dfs[[i]]<-iris[sample(1:nrow(iris),3),-5]
}
apply
.
– Gregor
13 July 2018 в 23:25
max
принимает только вектор.max
не принимает...
, но возвращает одно значение – Onyambu 13 July 2018 в 23:58