簡體   English   中英

如何使 onClick 方法的 if else 語句中的 holder 在 onBindViewHolder 方法的 arguments 中的參數 Viewholder 中沒有 final 的情況下工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM