guoshen
2024-06-29 5325e22a184b53aadcc5e9552cb1ec54f9c8ad81
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
package com.application.zhangshi_app_android.adapter;
 
import android.content.Context;
import android.content.Intent;
import android.util.TypedValue;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.FrameLayout;
 
import androidx.recyclerview.widget.GridLayoutManager;
 
import com.android.app_base.base.BaseConfig;
import com.android.app_base.base.adapter.BaseRVAdapter;
import com.android.app_base.manager.AppManager;
import com.android.app_base.utils.Utils;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.bean.WebcastBean;
import com.application.zhangshi_app_android.databinding.ItemWebcastBinding;
import com.application.zhangshi_app_android.ui.function.WebcastActivityViewModel;
import com.application.zhangshi_app_android.ui.function.WebcastDetailActivity;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
/**
 * @author Ljj
 * @date 2023.03.18. 10:27
 * @desc 家大事记 recyclerView 的 adapter
 */
public class WebcastRvAdapter extends BaseRVAdapter<WebcastBean, ItemWebcastBinding, WebcastRvAdapter.MyViewHolder> {
 
    private WebcastActivityViewModel viewModel;
    private final Map<WebcastBean, Boolean> expendMap = new HashMap<>();
    private boolean isCheckable;
 
 
    //接受一个上下文参数,用于初始化函数
    public WebcastRvAdapter(Context context) {
        super(context);
    }
 
    //除了上下文参数外,还接受一个view Model对象作为参数,用于与视图模型进行交互和数据绑定
    public WebcastRvAdapter(Context context, WebcastActivityViewModel viewModel) {
        super(context);
        this.viewModel = viewModel;
    }
 
 
    //绑定item视图
    @Override
    protected int getLayoutId() {
        return R.layout.item_webcast;
    }
 
    //创建视图持有者对象并返回,用于绑定视图和数据
    @Override
    protected MyViewHolder getViewHolder(ItemWebcastBinding itemBind, int viewType) {
        return new MyViewHolder(itemBind);
    }
 
 
    //onBind()
    @Override
    protected void onBind(MyViewHolder holder, int position) {
        //将当前位置的数据绑定到视图持有者中的布局绑定对象上,以便显示相应的家庭纪念品数据。
        holder.getBinding().setBean(mDataList.get(position));
 
        //typeValue1 存储解析后的属性值
        TypedValue typedValue1 = new TypedValue();
 
        //
        mContext.getTheme().resolveAttribute(R.attr.cardBackgroundColorFirst, typedValue1, true);
        TypedValue typedValue2 = new TypedValue();
        mContext.getTheme().resolveAttribute(R.attr.cardBackgroundColorSecond, typedValue2, true);
        //position为奇数的时候,用typedValue1作为背景色,偶数时用typedValue2。
        if (position % 2 != 0){
            holder.getBinding().cardView.setCardBackgroundColor(typedValue1.data);
        }else {
            holder.getBinding().cardView.setCardBackgroundColor(typedValue2.data);
        }
 
        //expendMap 是一个用于存储列表项展开状态的 Map,
        // 这里用来检查当前位置对应的数据是否已经在 Map 中存在,
        // 如果不存在,则将其添加到 Map 中,并设置其展开状态为 false。
        if (!expendMap.containsKey(getItem(position))){
            expendMap.put(getItem(position),false);
        }
 
 
 
        //根据主题选择对应图标
        TypedValue unfoldIcon = new TypedValue();
        mContext.getTheme().resolveAttribute(R.attr.icUnfold, unfoldIcon, true);
        TypedValue foldIcon = new TypedValue();
        mContext.getTheme().resolveAttribute(R.attr.icFold, foldIcon, true);
 
        if (Boolean.TRUE.equals(expendMap.get(getItem(position)))){
            holder.getBinding().ivFold.setBackgroundResource(unfoldIcon.resourceId);
            holder.getBinding().cardView.post(() -> {
                holder.getBinding().cardView.getLayoutParams().height = FrameLayout.LayoutParams.WRAP_CONTENT;
                holder.getBinding().cardView.requestLayout();
            });
        }else{
            holder.getBinding().ivFold.setBackgroundResource(foldIcon.resourceId);
            holder.getBinding().cardView.post(() -> {
                holder.getBinding().cardView.getLayoutParams().height = holder.getBinding().layoutTitle.getMeasuredHeight();
                holder.getBinding().cardView.requestLayout();
            });
        }
 
 
        //这段代码的作用是根据条件显示或隐藏复选框,并在用户选择列表项时更新相应的 LiveData 数据以及界面上的复选框状态
        if (isCheckable){
            holder.getBinding().ivFlower.setVisibility(View.GONE);
            if (mDataList.get(position).getOwnData() == 1){
                holder.getBinding().checkbox.setVisibility(View.VISIBLE);
            }else {
                holder.getBinding().checkbox.setVisibility(View.GONE);
            }
 
 
            holder.getBinding().checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if (viewModel.getCheckListLiveData().getValue() == null){
                        viewModel.getCheckListLiveData().setValue(new ArrayList<>());
                    }
                    List<WebcastBean> list = new ArrayList<>(viewModel.getCheckListLiveData().getValue());
                    if (isChecked){
                        if (!list.contains(mDataList.get(position))){
                            list.add(mDataList.get(position));
                        }
                    }else{
                        list.remove(mDataList.get(position));
                    }
                    viewModel.getCheckListLiveData().setValue(list);
                }
            });
            holder.getBinding().checkbox.setChecked(viewModel.getCheckListLiveData().getValue().contains(mDataList.get(position)));
        }else{
            holder.getBinding().checkbox.setVisibility(View.GONE);
            if (mDataList.get(position).getOwnData() == 1){
                holder.getBinding().ivFlower.setVisibility(View.VISIBLE);
            }else {
                holder.getBinding().ivFlower.setVisibility(View.GONE);
            }
        }
 
 
 
 
        holder.getBinding().layoutTitle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //如果expendMap 中存储的当前位置的状态是 true,表示当前视图是展开状态,需要执行折叠操作:
                if (Boolean.TRUE.equals(expendMap.get(getItem(position)))){
 
                    //获取卡片视图的初始高度
                    int initialHeight = holder.getBinding().cardView.getMeasuredHeight();
                    //获取标题布局的高度。
                    int collapsedHeight = holder.getBinding().layoutTitle.getMeasuredHeight();
 
                    //调用 Utils.pullCollapse() 方法执行折叠动画,并传入卡片视图的初始高度和标题布局的高度。
                    Utils.pullCollapse(holder.getBinding().cardView,initialHeight,collapsedHeight);
                    holder.getBinding().ivFold.setBackgroundResource(foldIcon.resourceId);
 
                    //将状态设置为折叠
                    expendMap.put(getItem(position),false);
                }else{
                    //获取卡片视图的初始高度 initialHeight。
                    final int initialHeight = holder.getBinding().cardView.getMeasuredHeight();
                    //测量卡片视图的目标高度 targetHeight
                    holder.getBinding().cardView.measure(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT);
                    int targetHeight = holder.getBinding().cardView.getMeasuredHeight();
                    //调用 Utils.dropExpand() 方法执行展开动画,并传入卡片视图的初始高度和目标高度。
                    Utils.dropExpand(holder.getBinding().cardView,initialHeight,targetHeight);
                    //更新折叠图标为展开状态。
                    holder.getBinding().ivFold.setBackgroundResource(unfoldIcon.resourceId);
                    expendMap.put(getItem(position),true);
                }
            }
        });
 
        //设置监听事件,当用户点击holder.itemView时,执行下面操作
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //创建一个新的 Intent 对象,该对象用于启动 WebcastDetailActivity 活动。
 
 
                AppManager.getAppManager().startActivity(
                        new Intent(getRecyclerView().getContext(), WebcastDetailActivity.class)
                                .putExtra(BaseConfig.EXTRA_TYPE,0)
                                .putExtra("bean",mDataList.get(position)));
            }
        });
 
 
        //设置监听事件,当用户点击layout中对应的layout_modify时,执行下面操作
//        holder.getBinding().layoutModify.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                //创建一个新的 Intent 对象,该对象用于启动 FamilyMemorabiliaDetailActivity 活动。
//                AppManager.getAppManager().startActivity(
//                        new Intent(getRecyclerView().getContext(), MeetingDetailActivity.class)
//                                .putExtra(BaseConfig.EXTRA_TYPE,2)
//                                .putExtra("bean",mDataList.get(position)));
//            }
//        });
 
 
        //设置监听事件,当用户点击layout中对应的layout_delete时,执行下面操作
//        holder.getBinding().layoutDelete.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                new UIDialog.Builder(mContext)
//                        .setTitle("您确定要删除该项目吗")
//                        .setContent("项目删除后将无法恢复")
//                        .setConfirm("确定")
//                        .setCancel("取消")
//                        .setListener(new UIDialog.OnListener() {
//                            @Override
//                            public void onConfirm(BaseDialog dialog) {
//                                viewModel.deleteItem(mDataList.get(position));
//                            }
//                        })
//                        .show();
//            }
//        });
 
 
        //ElectronicFileAdapter 适配器来显示电子文件列表,并将其绑定到 视图layout中的rv_image
        ElectronicFileAdapter adapter = new ElectronicFileAdapter(mContext);
        adapter.setData(Utils.splitString2List(mDataList.get(position).getUrl(),","));
        holder.getBinding().rvImage.setLayoutManager(new GridLayoutManager(mContext,3));
        holder.getBinding().rvImage.setAdapter(adapter);
    }
 
 
 
 
 
 
 
 
    //notifyItemRangeChanged(0, getItemCount()) 方法,通知适配器范围内的项已更改,以便在 RecyclerView 中更新相应的视图。
    public void setCheckable(boolean b) {
        isCheckable = b;
        notifyItemRangeChanged(0,getItemCount());
    }
 
 
    public static class MyViewHolder extends BaseViewHolder<ItemWebcastBinding>{
        public MyViewHolder(ItemWebcastBinding binding) {
            super(binding);
        }
    }
 
}