package com.basic.security.fragment; import android.graphics.Color; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import com.basic.security.base.BaseApplication; import com.basic.security.model.ModelAdapter; import com.basic.security.model.Org; import com.basic.security.model.OrgUI; import com.basic.security.utils.ActivityUtil; import com.basic.security.utils.KeyboardUtil; import com.basic.security.widget.ConfirmDialog; import java.util.HashSet; import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class TreeAdapter extends BaseAdapter { static ExecutorService executorService = Executors.newSingleThreadExecutor(); public TreeNodeList treeNodeList = new TreeNodeList(); public Set viewHolderSet = new HashSet<>(); public int position = 0; public boolean isDialog = false; public boolean smallFont = false; public ModelAdapter selectedOrg; public OrgSelectedListener orgSelectedListener; long findTreeNodeListLastTime = 0; public TreeAdapter() { } public TreeAdapter(boolean isDialog) { this.isDialog = isDialog; this.smallFont = smallFont; } public TreeAdapter(boolean isDialog, boolean smallFont) { this.isDialog = isDialog; this.smallFont = smallFont; } public Object getItem(int position) { return treeNodeList.getItem(position); } public long getItemId(int position) { return position; } public int getCount() { return treeNodeList.getCount(); } public void findTreeNodeList(boolean clearSelectedState) { if (System.currentTimeMillis() - findTreeNodeListLastTime > 15 * 1000) { BaseApplication.getApplication().activity.fragment_org .findTreeNodeList(this, clearSelectedState, isDialog); findTreeNodeListLastTime = System.currentTimeMillis(); } } public View getView(int position, View convertView, ViewGroup parent) { TreeAdapter.ViewHolder holder; if (convertView == null) { if (smallFont) { convertView = LayoutInflater.from(BaseApplication.getApplication()).inflate(com.basic.security.utils.ResolutionAdaptation.adapter_treeview_small(), null); } else { convertView = LayoutInflater.from(BaseApplication.getApplication()).inflate(com.basic.security.utils.ResolutionAdaptation.adapter_treeview(), null); } holder = new TreeAdapter.ViewHolder(convertView); convertView.setTag(holder); viewHolderSet.add(holder); } else { holder = (TreeAdapter.ViewHolder) convertView.getTag(); } this.position = position; holder.updateData(position); return convertView; } public void clearUI() { for (ViewHolder viewHolder : viewHolderSet) { viewHolder.nameText.setTextColor(Color.WHITE); } treeNodeList.clearUI(); } public void setUI(String initOrgId) { if (!TextUtils.isEmpty(initOrgId)) { for (ViewHolder viewHolder : viewHolderSet) { if (initOrgId.equals(viewHolder.treeNode.getString(Org.id))) { viewHolder.nameText.setTextColor(Color.YELLOW); } else { viewHolder.nameText.setTextColor(Color.WHITE); } } } treeNodeList.setUI(initOrgId); } public void setOrgSelectedListener(OrgSelectedListener orgSelectedListener) { this.orgSelectedListener = orgSelectedListener; } public interface OrgSelectedListener { void orgSelected(ModelAdapter org); } public class ViewHolder { public TextView nameText, padding; public EditText nameInput; public ModelAdapter treeNode; public ImageView nameInputConfirm, expand, collapse, edit, add, delete; public View nameInputParent; ConfirmDialog confirmDialog; public ViewHolder(View convertView) { collapse = convertView.findViewById(com.basic.security.utils.RUtils.R_id_collapse); expand = convertView.findViewById(com.basic.security.utils.RUtils.R_id_expand); nameText = convertView.findViewById(com.basic.security.utils.RUtils.R_id_text); padding = convertView.findViewById(com.basic.security.utils.RUtils.R_id_padding); nameInput = convertView.findViewById(com.basic.security.utils.RUtils.R_id_org_name); nameInputConfirm = convertView.findViewById(com.basic.security.utils.RUtils.R_id_name_input_confirm); nameInputParent = convertView.findViewById(com.basic.security.utils.RUtils.R_id_name_input_parent); edit = convertView.findViewById(com.basic.security.utils.RUtils.R_id_edit); add = convertView.findViewById(com.basic.security.utils.RUtils.R_id_add); delete = convertView.findViewById(com.basic.security.utils.RUtils.R_id_delete); nameInputConfirm.setOnClickListener((View v) -> { KeyboardUtil.hideSoftKeyboard(); BaseApplication.getApplication().activity.fragment_org.updateOrgName(treeNode.getId(), nameInput.getText().toString()); }); if (!isDialog) { BaseApplication.getApplication().activity.setupUIs(expand, collapse, nameText, add, delete); } viewHolderSet.add(this); } public void updateData(int position) { treeNode = (ModelAdapter) getItem(position); expand.setOnClickListener((View v) -> { executorService.execute(() -> { try { treeNodeList.collapse(treeNode); ActivityUtil.mainActivity().runOnUiThread(() -> TreeAdapter.this.notifyDataSetChanged()); } catch (Exception e) { e.printStackTrace(); } }); }); collapse.setOnClickListener((View v) -> { executorService.execute(() -> { try { treeNodeList.expand(treeNode); ActivityUtil.mainActivity().runOnUiThread(() -> TreeAdapter.this.notifyDataSetChanged()); } catch (Exception e) { e.printStackTrace(); } }); }); nameText.setOnClickListener((View v) -> { selectedOrg = treeNode; if (!isDialog) { treeNodeList.editTrue(position); } if (isDialog && orgSelectedListener != null) { treeNode.setString(OrgUI.full_name, treeNode.getString(Org.name)); orgSelectedListener.orgSelected(treeNode); } if (isDialog) { treeNodeList.setUISelected(position, OrgUI.name_selected); } TreeAdapter.this.notifyDataSetChanged(); }); edit.setOnClickListener((View v) -> { treeNodeList.setUIFalse(position, Org.name); treeNodeList.setUITrue(position, Org.nameInput); TreeAdapter.this.notifyDataSetChanged(); }); add.setOnClickListener((View v) -> { BaseApplication.getApplication().activity.fragment_org.addChildOrg(treeNode); }); delete.setOnClickListener((View v) -> { confirmDialog = new ConfirmDialog(BaseApplication.getApplication().activity, "确认是否删除", "确认删除", "取消"); confirmDialog.show(); confirmDialog.setClickListener(new ConfirmDialog.ClickListenerInterface() { public void doConfirm() { BaseApplication.getApplication().activity.fragment_org.deleteOrgById(treeNode.getId()); confirmDialog.dismiss(); } public void doCancel() { confirmDialog.dismiss(); } }); }); padding.setText(treeNode.getString(Org.padding)); expand.setVisibility(View.GONE); collapse.setVisibility(View.GONE); nameText.setText(treeNode.getString(Org.name)); if (isDialog) { if (treeNodeList.getUIBool(position, OrgUI.name_selected)) { nameText.setTextColor(Color.YELLOW); } else { nameText.setTextColor(Color.WHITE); } } nameInput.setText(nameText.getText()); if (!treeNode.getBool(Org.leaf)) { if (treeNode.getBool(Org.expand)) { expand.setVisibility(View.VISIBLE); } else { collapse.setVisibility(View.VISIBLE); } } nameText.setVisibility(treeNodeList.getUIBool(position, OrgUI.name) ? View.VISIBLE : View.GONE); nameInput.setVisibility(treeNodeList.getUIBool(position, OrgUI.nameInput) ? View.VISIBLE : View.GONE); edit.setVisibility(treeNodeList.getUIBool(position, OrgUI.edit) ? View.VISIBLE : View.GONE); int level = Integer.parseInt(treeNode.getString(Org.level)); add.setVisibility(treeNodeList.getUIBool(position, OrgUI.add) ? View.VISIBLE : View.GONE); if (level > 2) { add.setVisibility(View.GONE); } delete.setVisibility(treeNodeList.getUIBool(position, OrgUI.delete) && !"0".equals(treeNode.getString(Org.pid)) ? View.VISIBLE : View.GONE); nameInputConfirm.setVisibility(treeNodeList.getUIBool(position, OrgUI.nameInput) ? View.VISIBLE : View.GONE); nameInputParent.setVisibility(treeNodeList.getUIBool(position, OrgUI.nameInput) ? View.VISIBLE : View.GONE); } } }