我有一個RecyclerView,它顯示從數據庫派生的一系列視圖。我想確認用戶已經通過突出顯示其邊緣來選擇其中一個視圖,並且我已經成功地這樣做了。如果用戶繼續選擇不同選項,我希望刪除原始選擇中的突出顯示。這是我遇到了一些麻煩的地方。直接從RecyclerView訪問ViewHolder,按位置
最初的亮點並不是什麼問題,因爲我是在內部做的。但是,我不知道如何使用適配器位置訪問以前的視圖。我一直在搜索StackOverflow大約一個小時,因爲我無法在Android API或谷歌上找到很多東西。許多用戶似乎提出了類似的問題,但最終,細微的差異使任何有用的答案都無效。
裏面我ViewHolder
,這是我RecyclerView
的內部public class
,我有一個OnClickListener
如下:
@Override
public void onClick(View view) {
if(!selected) {
selected = true;
view.setBackgroundResource(R.drawable.default_selection_background);
} else {
selected = false;
view.setBackgroundResource(0);
}
UpdateSelected(getAdapterPosition());
}
這點回到我的RecyclerView
,並坦率地說,我還沒有添加任何的工作代碼我的UpdateSelected(int position)
方法。
如果有幫助,我打算把它的功能是這樣的:
void UpdateSelected(int position) {
if(position != currentlySelected) {
ViewHolder[currentlySelected].Deselect();
}
}
public class ViewHolder extends RecyclerView.ViewHolder {
...
public void Deselect() {
// and from here, I can go on as normal.
}
}
我已經注意到了用戶的建議他人使用getLayoutPosition()
來推導UI目的位置,除非他們特別希望繼續工作內部數據,這是我打算做的。
如何從我的RecyclerView使用其位置訪問特定的ViewHolder?
太棒了!奇蹟般有效。我必須做的只是在'onBindViewHolder'中,它立即可以訪問'view'。我只是使用'viewHolder.itemView.setBackgroundResource(backgroundRes)'。爲了提高效率,我也只在'previousSelection'和'currentSelection'上使用'notifyItemChanged',但非常感謝。 – Gnemlock
我也面臨同樣的問題。所以我嘗試這個解決方案,但在我的情況下沒有工作。 @Gnemlock –
我只是偶然發現了這個答案,雖然不錯,但我建議將'notifyDataSetChanged()'更改爲'notifyItemChanged(selectedPosition)'。 當您可以精確地告訴適配器需要更新哪些視圖時,避免調用notifyDataSetChanged()是個好習慣。 –