package com.nodka.zysjtest; import android.content.Context; import android.os.Handler; import android.os.Looper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.Gravity; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.button.MaterialButton; import com.google.android.material.materialswitch.MaterialSwitch; import java.util.List; class TestItemAdapter extends RecyclerView.Adapter { private final List items; private final Handler handler = new Handler(Looper.getMainLooper()); TestItemAdapter(List items) { this.items = items; } @NonNull @Override public TestItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_test_item, parent, false); return new TestItemViewHolder(view); } @Override public void onBindViewHolder(@NonNull TestItemViewHolder holder, int position) { TestItem item = items.get(position); holder.chineseNameTextView.setText(item.chineseName); holder.methodNameTextView.setText(item.methodName); holder.descriptionTextView.setText(item.description); holder.resultTextView.setText(item.result); bindSwitch(holder, item); bindInputs(holder, item); holder.testButton.setOnClickListener(v -> { int adapterPosition = holder.getAdapterPosition(); if (adapterPosition == RecyclerView.NO_POSITION) { return; } if (item.requiresConfirmation) { showConfirmation(v.getContext(), item, () -> runTest(adapterPosition, holder)); return; } runTest(adapterPosition, holder); }); } @Override public int getItemCount() { return items.size(); } private void bindInputs(TestItemViewHolder holder, TestItem item) { holder.inputContainer.removeAllViews(); holder.inputEditText.setText(null); if (!item.hasInput) { holder.inputEditText.setVisibility(View.GONE); holder.inputContainer.setVisibility(View.GONE); return; } holder.inputEditText.setVisibility(View.VISIBLE); holder.inputContainer.setVisibility(item.inputFields.length > 1 ? View.VISIBLE : View.GONE); bindInputField(holder.inputEditText, item.inputFields[0]); if (item.inputFields.length > 1) { Context context = holder.itemView.getContext(); for (int i = 1; i < item.inputFields.length; i++) { EditText extraInput = createInputEditText(context, item.inputFields[i], true); holder.inputContainer.addView(extraInput); } } } private void bindSwitch(TestItemViewHolder holder, TestItem item) { if (!item.hasSwitch) { holder.switchView.setVisibility(View.GONE); holder.switchView.setOnCheckedChangeListener(null); return; } holder.switchView.setVisibility(View.VISIBLE); holder.switchView.setText(item.switchLabel); holder.switchView.setOnCheckedChangeListener(null); holder.switchView.setChecked(item.switchChecked); holder.switchView.setOnCheckedChangeListener((buttonView, isChecked) -> item.switchChecked = isChecked); } private void bindInputField(EditText editText, TestItem.InputField inputField) { editText.setHint(inputField.hint); editText.setInputType(inputField.inputType); editText.setText(inputField.value); } private EditText createInputEditText(Context context, TestItem.InputField inputField, boolean addTopMargin) { EditText editText = new EditText(context); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, dpToPx(context, 40)); if (addTopMargin) { params.topMargin = dpToPx(context, 8); } editText.setLayoutParams(params); editText.setBackgroundResource(R.drawable.bg_result_panel); editText.setGravity(Gravity.CENTER_VERTICAL | Gravity.START); editText.setHint(inputField.hint); editText.setInputType(inputField.inputType); editText.setMaxLines(1); editText.setSingleLine(true); editText.setPadding(dpToPx(context, 8), dpToPx(context, 6), dpToPx(context, 8), dpToPx(context, 6)); editText.setText(inputField.value); editText.setTextColor(context.getResources().getColor(R.color.text_primary, context.getTheme())); editText.setHintTextColor(context.getResources().getColor(R.color.text_secondary, context.getTheme())); editText.setTextSize(13f); return editText; } private void showConfirmation(Context context, TestItem item, Runnable onConfirmed) { new AlertDialog.Builder(context) .setMessage(item.confirmationMessage) .setNegativeButton(android.R.string.cancel, null) .setPositiveButton(android.R.string.ok, (dialog, which) -> onConfirmed.run()) .show(); } private void runTest(int position, TestItemViewHolder holder) { if (position == RecyclerView.NO_POSITION) { return; } TestItem item = items.get(position); String[] inputs = collectInputs(item, holder); item.result = "开始测试..."; notifyItemChanged(position); if (item.testAction == null) { handler.postDelayed(() -> { item.result = "测试通过:当前接口待接入真实 API"; notifyItemChanged(position); }, 500); return; } try { item.result = item.testAction.run(item, inputs); } catch (Exception e) { String message = e.getMessage(); if (message == null || message.isEmpty()) { message = e.getClass().getSimpleName(); } else { message = e.getClass().getSimpleName() + ": " + message; } item.result = "调用失败:" + message; } notifyItemChanged(position); } private String[] collectInputs(TestItem item, TestItemViewHolder holder) { if (!item.hasInput) { return new String[0]; } String[] inputs = new String[item.inputFields.length]; inputs[0] = readFieldValue(holder.inputEditText, item.inputFields[0]); item.setInputValue(0, inputs[0]); for (int i = 1; i < item.inputFields.length; i++) { EditText extraInput = (EditText) holder.inputContainer.getChildAt(i - 1); inputs[i] = readFieldValue(extraInput, item.inputFields[i]); item.setInputValue(i, inputs[i]); } return inputs; } private String readFieldValue(EditText editText, TestItem.InputField inputField) { String value = editText.getText().toString().trim(); if (value.isEmpty()) { value = inputField.defaultValue; editText.setText(value); } return value; } private int dpToPx(Context context, int dp) { float density = context.getResources().getDisplayMetrics().density; return Math.round(dp * density); } static class TestItemViewHolder extends RecyclerView.ViewHolder { private final TextView chineseNameTextView; private final TextView methodNameTextView; private final TextView descriptionTextView; private final MaterialSwitch switchView; private final EditText inputEditText; private final LinearLayout inputContainer; private final TextView resultTextView; private final MaterialButton testButton; TestItemViewHolder(@NonNull View itemView) { super(itemView); chineseNameTextView = itemView.findViewById(R.id.test_item_chinese_name_text); methodNameTextView = itemView.findViewById(R.id.test_item_method_name_text); descriptionTextView = itemView.findViewById(R.id.test_item_description_text); switchView = itemView.findViewById(R.id.test_item_switch); inputEditText = itemView.findViewById(R.id.test_item_input_edit); inputContainer = itemView.findViewById(R.id.test_item_input_container); resultTextView = itemView.findViewById(R.id.test_item_result_text); testButton = itemView.findViewById(R.id.test_item_button); } } }