[英]If and else statements not working in onClick() method in java
[英]How to make the holder in if else statements of onClick method work without final in argument Viewholder in arguments of onBindViewHolder method
我試圖在回收站視圖中的按鈕與文本 (layoutPasswd) 一起定位時更改文本,並在再次按下按鈕時將其改回原樣。就像密碼隱藏按鈕一樣。 適配器的值來自 static class object 和 arraylist。現在出現的問題是回收站視圖中所有項目(僅用於 layoutPasswd)的值是相同的。
public void onBindViewHolder(@NonNull final viewHolder holder, int position) {
holder.layoutUName.setText(users.get(position).getUserName());
pos = position;
holder.layoutPasswd.setText("********");
holder.btnViewChanger.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (holder.view1) {
holder.layoutPasswd.setText(users.get(pos).getPasswd());
holder.btnViewChanger.setText("hide");
holder.view1 = false;
} else {
holder.layoutPasswd.setText("********");;
holder.btnViewChanger.setText("Show");
holder.view1 = true;
}
}
});
您不能依賴 RecyclerView 中的 ViewHolders 或 Views 來保存任何 state,因為它們是可回收的。 每次視圖滾動到屏幕上時,首先它會調用您的onBindViewHolder
function 來更新該 ViewHolder 的內容以匹配數據。
如果視圖滾出屏幕,您在視圖或 onBindViewHolder 中的onBindViewHolder
實例上設置的任何配置都不能依賴於保持不變,因為原始 ViewHolder 可能會被回收以用於其他一些數據,並且當它滾動回來時屏幕上,您可能正在查看從剛剛滾出屏幕的其他數據回收的其他視圖。
所以如果你的視圖有你想要“堅持”的配置,你必須在更改它時備份它,並在onBindViewHolder
中恢復它。 完成此操作的方式取決於您如何管理傳遞給適配器的數據。
如果你可以修改你的用戶class,你可以添加一個Boolean
來存儲它是否應該顯示密碼。 然后在你的onBindViewHolder
中,根據這個 Boolean 恢復 state。當 state 改變時,你也更新這個 Boolean。
我還更新了點擊偵聽器的工作方式以簡化切換。 我刪除了pos = position
行,因為幾乎可以肯定這不是你應該做的事情。
public void onBindViewHolder(@NonNull final viewHolder holder, int position) {
final User user = users.get(position)
holder.layoutUName.setText(user.getUserName());
holder.layoutPasswd.setText(user.isShowPassword() ? user.getPasswd() : "********");
holder.btnViewChanger.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
user.setShowPassword(!user.isShowPassword());
holder.layoutPasswd.setText(user.isShowPassword() ? user.getPasswd() : "********");
holder.btnViewChanger.setText(user.isShowPassword() ? "hide" : "show");
}
});
// ...
}
如果不能修改User class,這個就比較復雜了。 然后適配器應該有自己的ArrayList<Boolean>
來通過 position 索引存儲 state,但是您需要至少保留此列表與綁定的數據一樣長,並且如果刷新整個數據列表則將所有內容重置為 false .
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.