package com.example.kucun2.ui.dingdan;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.app.AlertDialog;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.HorizontalScrollView;
import android.widget.PopupMenu;
import android.widget.SearchView;
import android.widget.Spinner;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import com.example.kucun2.MainActivity;
import com.example.kucun2.R;
import com.example.kucun2.View.HorizontalScrollTextView;
import com.example.kucun2.entity.Bancai;
import com.example.kucun2.entity.Chanpin;
import com.example.kucun2.entity.Chanpin_Zujian;
import com.example.kucun2.entity.Dingdan;
import com.example.kucun2.entity.Dingdan_chanpin_zujian;
import com.example.kucun2.entity.Dingdan_Chanpin;
import com.example.kucun2.entity.Zujian;
import com.example.kucun2.entity.data.Data;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class OrderDisplayFragment extends Fragment {
// 视图组件
private TableLayout table;
private HorizontalScrollView horizontalScrollView;
// private View scrollIndicator;
private SearchView searchView;
private Spinner columnSelector;
private View rootView;
// 数据管理
private List<Object[]> allTableRowsData = new ArrayList<>();
private List<Object[]> filteredTableRowsData = new ArrayList<>();
private boolean isDataLoaded = false;
// 排序状态
private int currentSortColumn = -1;
private boolean sortAscending = true;
// // 滚动指示器动画
// private ValueAnimator scrollIndicatorAnimator;
// private boolean isIndicatorVisible = false;
//
// // 滚动监听器
// private final ViewTreeObserver.OnScrollChangedListener scrollListener =
// this::handleScrollChanged;
//=== 生命周期方法 ===//
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_order_display, container, false);
initViews();
initColumnSelector();
setupSearchFunctionality();
// setupScrollListener();
// 数据加载逻辑
if (Data.dingdans.isEmpty()) {
showLoadingIndicator();
setupDataLoadListener();
} else {
fillTableData();
isDataLoaded = true;
}
return rootView;
}
@Override
public void onDestroyView() {
super.onDestroyView();
// 清理资源防止内存泄漏
if (horizontalScrollView != null) {
ViewTreeObserver observer = horizontalScrollView.getViewTreeObserver();
if (observer.isAlive()) {
observer.removeOnScrollChangedListener(scrollListener);
}
}
// scrollIndicator = null;
horizontalScrollView = null;
table = null;
rootView = null;
}
//=== 初始化方法 ===//
private void initViews() {
table = rootView.findViewById(R.id.orderTable);
horizontalScrollView = rootView.findViewById(R.id.horizontalScrollContainer);
// scrollIndicator = rootView.findViewById(R.id.scroll_indicator);
searchView = rootView.findViewById(R.id.search_view);
columnSelector = rootView.findViewById(R.id.column_selector);
addTableHeader(table); // 添加表头
}
/**
* 初始化列选择器(用于搜索过滤)
*/
private void initColumnSelector() {
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
requireContext(),
R.array.table_headers,
android.R.layout.simple_spinner_item
);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
columnSelector.setAdapter(adapter);
columnSelector.setSelection(0);
columnSelector.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
applySearchFilter();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {}
});
}
/**
* 设置搜索功能
*/
private void setupSearchFunctionality() {
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
applySearchFilter();
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
applySearchFilter();
return true;
}
});
}
// /**
// * 设置滚动监听器(控制滚动指示器显示)
// */
// private void setupScrollListener() {
// horizontalScrollView.getViewTreeObserver().addOnScrollChangedListener(scrollListener);
// }
// 滚动变化处理
private void handleScrollChanged() {
if (horizontalScrollView.getChildCount() == 0) return;
View child = horizontalScrollView.getChildAt(0);
int maxScroll = child.getWidth() - horizontalScrollView.getWidth();
int currentScroll = horizontalScrollView.getScrollX();
if (currentScroll > 0 && maxScroll > 0) {
if (!isIndicatorVisible) showScrollIndicator();
updateScrollIndicatorPosition(currentScroll, maxScroll);
} else {
hideScrollIndicator();
}
}
//=== 数据加载方法 ===//
/**
* 填充表格数据(核心数据重组逻辑)
* 建立订单->产品->组件->板材的四级关系映射
*/
private void fillTableData() {
// 1. 创建映射关系提高查询效率
Map<Integer, List<Dingdan_Chanpin>> orderProductMap = new HashMap<>();
Map<Integer, List<Chanpin_Zujian>> productComponentMap = new HashMap<>();
Map<Integer, List<Dingdan_chanpin_zujian>> componentMaterialMap = new HashMap<>();
// 2. 构建映射关系
for (Dingdan_Chanpin op : Data.dingdan_chanpins) {
if (op != null && op.getDingdan() != null) {
orderProductMap.computeIfAbsent(op.getDingdan().getId(), k -> new ArrayList<>()).add(op);
}
}
for (Chanpin_Zujian cz : Data.chanpin_zujians) {
if (cz.getChanpin() != null) {
productComponentMap.computeIfAbsent(cz.getChanpin().getId(), k -> new ArrayList<>()).add(cz);
}
}
for (Dingdan_chanpin_zujian dm : Data.Dingdan_chanpin_zujians) {
if (dm.getZujian() != null) {
componentMaterialMap.computeIfAbsent(dm.getZujian().getId(), k -> new ArrayList<>()).add(dm);
}
}
// 3. 重组数据
for (Dingdan order : Data.dingdans) {
List<Dingdan_Chanpin> products = orderProductMap.get(order.getId());
if (products != null) {
for (Dingdan_Chanpin op : products) {
Chanpin product = op.getChanpin();
if (product == null) continue;
List<Chanpin_Zujian> components = productComponentMap.get(product.getId());
if (components == null) continue;
for (Chanpin_Zujian cz : components) {
Zujian component = cz.getZujian();
if (component == null) continue;
List<Dingdan_chanpin_zujian> materials = componentMaterialMap.get(component.getId());
if (materials == null) continue;
for (Dingdan_chanpin_zujian dm : materials) {
Object[] rowData = createRowData(order, product, op, cz, dm);
allTableRowsData.add(rowData);
filteredTableRowsData.add(rowData);
}
}
}
}
}
// 4. 初始排序
sortTableData(-1, true);
}
/**
* 创建表格行数据对象
*/
private Object[] createRowData(Dingdan order, Chanpin product, Dingdan_Chanpin dingdan_chanpin,
Chanpin_Zujian component, Dingdan_chanpin_zujian material) {
Bancai board = material.getBancai();
return new Object[]{
order.getNumber(), // 订单号
product.getBianhao(), // 产品编号
dingdan_chanpin.getShuliang(),// 产品数量
component.getZujian().getName(), // 组件名
board != null ? board.TableText() : "N/A", // 板材信息
Math.round(component.getOne_howmany()), // 板材/组件
material.getShuliang(), // 订购数量
"操作" // 操作按钮
};
}
//=== 表格操作 ===//
/**
* 排序表格数据
* @param columnIndex 列索引(-1表示初始状态)
* @param ascending 是否升序
*/
private void sortTableData(int columnIndex, boolean ascending) {
// 更新排序状态
if (columnIndex >= 0) {
if (currentSortColumn == columnIndex) {
sortAscending = !ascending;
} else {
currentSortColumn = columnIndex;
sortAscending = true;
}
}
// 创建自定义比较器
Comparator<Object[]> comparator = (row1, row2) -> {
if (currentSortColumn < 0) return 0;
Object val1 = row1[currentSortColumn];
Object val2 = row2[currentSortColumn];
// 处理空值
if (val1 == null && val2 == null) return 0;
if (val1 == null) return -1;
if (val2 == null) return 1;
try {
// 数值列比较
if (currentSortColumn == 2 || currentSortColumn == 5 || currentSortColumn == 6) {
double num1 = Double.parseDouble(val1.toString());
double num2 = Double.parseDouble(val2.toString());
return sortAscending ? Double.compare(num1, num2) : Double.compare(num2, num1);
}
// 字符串列比较
else {
String str1 = val1.toString().toLowerCase();
String str2 = val2.toString().toLowerCase();
return sortAscending ? str1.compareTo(str2) : str2.compareTo(str1);
}
} catch (NumberFormatException e) {
// 数值解析失败时按字符串比较
String str1 = val1.toString().toLowerCase();
String str2 = val2.toString().toLowerCase();
return sortAscending ? str1.compareTo(str2) : str2.compareTo(str1);
}
};
// 执行排序或直接复制数据
if (columnIndex == -1) {
filteredTableRowsData.clear();
filteredTableRowsData.addAll(allTableRowsData);
} else {
Collections.sort(filteredTableRowsData, comparator);
}
refreshTableWithData(filteredTableRowsData);
}
/**
* 刷新表格显示
*/
private void refreshTableWithData(Iterable<? extends Object[]> dataToShow) {
removeAllRowsSafely(); // 清除旧行
int addedRows = 0;
for (Object[] rowData : dataToShow) {
addTableRow(rowData); // 添加新行
addedRows++;
}
if (addedRows == 0) {
addEmptyTableRow(); // 空数据提示
}
}
/**
* 添加表格行(动态创建视图)
*/
private void addTableRow(Object[] rowData) {
TableRow row = new TableRow(requireContext());
TableLayout.LayoutParams rowParams = new TableLayout.LayoutParams(
TableLayout.LayoutParams.MATCH_PARENT,
TableLayout.LayoutParams.WRAP_CONTENT
);
row.setLayoutParams(rowParams);
row.setMinimumHeight(dpToPx(36));
for (int i = 0; i < rowData.length; i++) {
if (i == rowData.length - 1) { // 操作列
Button actionButton = new Button(requireContext());
actionButton.setText("操作");
actionButton.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
actionButton.setBackgroundResource(R.drawable.btn_selector);
TableRow.LayoutParams btnParams = new TableRow.LayoutParams(
0,
TableRow.LayoutParams.WRAP_CONTENT,
0.5f
);
btnParams.setMargins(dpToPx(1), dpToPx(1), dpToPx(1), dpToPx(1));
actionButton.setLayoutParams(btnParams);
actionButton.setOnClickListener(v -> handleRowAction(rowData, v));
row.addView(actionButton);
} else { // 数据列
HorizontalScrollTextView textView = new HorizontalScrollTextView(requireContext());
textView.setText(String.valueOf(rowData[i]));
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
int padding = dpToPx(8);
textView.setPadding(padding, padding/2, padding, padding);
textView.setBackgroundResource(R.drawable.cell_border);
TableRow.LayoutParams colParams = new TableRow.LayoutParams(
0,
TableRow.LayoutParams.MATCH_PARENT,
rowData[i].toString().length() > 10 ? 2.0f : 1.0f
);
textView.setLayoutParams(colParams);
row.addView(textView);
}
}
table.addView(row);
}
//=== 用户交互处理 ===//
/**
* 处理行操作按钮点击
*/
private void handleRowAction(Object[] rowData, View anchorButton) {
PopupMenu popupMenu = new PopupMenu(requireContext(), anchorButton);
popupMenu.getMenuInflater().inflate(R.menu.row_actions_menu, popupMenu.getMenu());
popupMenu.setGravity(Gravity.BOTTOM);
popupMenu.setOnMenuItemClickListener(item -> {
int itemId = item.getItemId();
if (itemId == R.id.action_view_details) {
showDetailDialog(rowData[0].toString(), rowData[1].toString());
return true;
} else if (itemId == R.id.action_edit) {
editRowData(rowData);
return true;
} else if (itemId == R.id.action_delete) {
deleteRowWithConfirm(rowData);
return true;
}
return false;
});
popupMenu.show();
}
/**
* 删除行数据(带确认对话框)
*/
private void deleteRowWithConfirm(Object[] rowData) {
new AlertDialog.Builder(requireContext())
.setTitle("确认删除")
.setMessage("确定要删除订单 " + rowData[0] + " 吗?")
.setPositiveButton("删除", (dialog, which) -> deleteRow(rowData))
.setNegativeButton("取消", null)
.show();
}
/**
* 实际删除逻辑
*/
private void deleteRow(Object[] rowData) {
// 从两个数据集中移除
allTableRowsData.removeIf(row -> Arrays.equals(row, rowData));
filteredTableRowsData.removeIf(row -> Arrays.equals(row, rowData));
refreshTableWithData(filteredTableRowsData);
Toast.makeText(requireContext(), "已删除订单", Toast.LENGTH_SHORT).show();
}
//=== 辅助方法 ===//
/**
* 应用搜索过滤
*/
private void applySearchFilter() {
String query = searchView.getQuery().toString().trim().toLowerCase();
int selectedColumn = columnSelector.getSelectedItemPosition();
filteredTableRowsData.clear();
if (query.isEmpty()) {
filteredTableRowsData.addAll(allTableRowsData);
} else {
// 根据选择的列进行过滤
for (Object[] row : allTableRowsData) {
// 全局搜索(所有列)
if (selectedColumn == 0) {
for (Object cell : row) {
if (cell != null && cell.toString().toLowerCase().contains(query)) {
filteredTableRowsData.add(row);
break;
}
}
}
// 特定列搜索
else if (selectedColumn > 0 && selectedColumn <= row.length) {
int colIndex = selectedColumn - 1;
if (row[colIndex] != null &&
row[colIndex].toString().toLowerCase().contains(query)) {
filteredTableRowsData.add(row);
}
}
}
}
refreshTableWithData(filteredTableRowsData);
}
/**
* 显示/隐藏滚动指示器
*/
private void showScrollIndicator() {
if (scrollIndicator == null) return;
isIndicatorVisible = true;
if (scrollIndicatorAnimator != null && scrollIndicatorAnimator.isRunning()) {
scrollIndicatorAnimator.cancel();
}
scrollIndicator.setVisibility(View.VISIBLE);
scrollIndicator.setAlpha(0f);
scrollIndicatorAnimator = ObjectAnimator.ofFloat(scrollIndicator, "alpha", 0f, 0.8f);
scrollIndicatorAnimator.setDuration(300);
scrollIndicatorAnimator.start();
}
private void hideScrollIndicator() {
if (scrollIndicator == null) return;
isIndicatorVisible = false;
if (scrollIndicatorAnimator != null && scrollIndicatorAnimator.isRunning()) {
scrollIndicatorAnimator.cancel();
}
scrollIndicatorAnimator = ObjectAnimator.ofFloat(scrollIndicator, "alpha", scrollIndicator.getAlpha(), 0f);
scrollIndicatorAnimator.setDuration(300);
scrollIndicatorAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
scrollIndicator.setVisibility(View.INVISIBLE);
}
});
scrollIndicatorAnimator.start();
}
private void updateScrollIndicatorPosition(int currentScroll, int maxScroll) {
if (scrollIndicator == null) return;
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) scrollIndicator.getLayoutParams();
float percentage = (float) currentScroll / maxScroll;
int maxMargin = getResources().getDisplayMetrics().widthPixels - scrollIndicator.getWidth();
params.rightMargin = (int) (maxMargin * percentage);
scrollIndicator.setLayoutParams(params);
}
/**
* 添加表头
*/
private void addTableHeader(TableLayout table) {
TableRow headerRow = new TableRow(requireContext());
headerRow.setLayoutParams(new TableLayout.LayoutParams(
TableLayout.LayoutParams.MATCH_PARENT,
TableLayout.LayoutParams.WRAP_CONTENT
));
headerRow.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.purple_500));
String[] headers = getResources().getStringArray(R.array.table_headers);
float[] weights = {1.0f, 1.0f, 1.0f, 1.0f, 2.0f, 1.0f, 1.0f};
for (int i = 0; i < headers.length; i++) {
HorizontalScrollTextView headerView = new HorizontalScrollTextView(requireContext());
headerView.setText(headers[i]);
headerView.setTextColor(Color.WHITE);
headerView.setTypeface(null, Typeface.BOLD);
headerView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
headerView.setPadding(dpToPx(8), dpToPx(8), dpToPx(8), dpToPx(8));
TableRow.LayoutParams colParams = new TableRow.LayoutParams(
0,
TableRow.LayoutParams.MATCH_PARENT,
weights[i]
);
headerView.setLayoutParams(colParams);
final int columnIndex = i;
headerView.setOnClickListener(v -> sortTableData(columnIndex, sortAscending));
headerRow.addView(headerView);
}
table.addView(headerRow);
}
/**
* 安全移除所有行(保留表头)
*/
private void removeAllRowsSafely() {
if (table.getChildCount() > 1) {
for (int i = table.getChildCount() - 1; i >= 1; i--) {
View child = table.getChildAt(i);
if (child instanceof TableRow) {
cleanupRowViews((TableRow) child);
}
table.removeViewAt(i);
}
}
}
private void cleanupRowViews(TableRow row) {
for (int i = 0; i < row.getChildCount(); i++) {
View view = row.getChildAt(i);
if (view instanceof Button) {
((Button) view).setOnClickListener(null);
}
}
}
private void addEmptyTableRow() {
TableRow row = new TableRow(requireContext());
TextView emptyView = new TextView(requireContext());
emptyView.setText("暂无数据");
emptyView.setGravity(Gravity.CENTER);
emptyView.setLayoutParams(new TableRow.LayoutParams(
TableRow.LayoutParams.MATCH_PARENT,
TableRow.LayoutParams.WRAP_CONTENT
));
row.addView(emptyView);
table.addView(row);
}
/**
* 显示详情对话框
*/
private void showDetailDialog(String orderNumber, String productId) {
new AlertDialog.Builder(requireContext())
.setTitle("订单详情")
.setMessage("订单号: " + orderNumber + "\n产品ID: " + productId)
.setPositiveButton("确定", null)
.show();
}
/**
* 编辑行数据
*/
private void editRowData(Object[] rowData) {
// 实际项目中应实现编辑表单
Toast.makeText(requireContext(), "编辑: " + rowData[0], Toast.LENGTH_SHORT).show();
}
/**
* 显示加载指示器
*/
private void showLoadingIndicator() {
// 实际项目中应显示进度条
Toast.makeText(requireContext(), "加载中...", Toast.LENGTH_SHORT).show();
}
/**
* 设置数据加载监听器
*/
private void setupDataLoadListener() {
if (getActivity() instanceof MainActivity) {
((MainActivity) getActivity()).setOnDataLoadListener(new MainActivity.OnDataLoadListener() {
@Override
public void onDataLoaded() {
requireActivity().runOnUiThread(() -> {
hideLoadingIndicator();
isDataLoaded = true;
fillTableData();
});
}
@Override
public void onDataError() {
requireActivity().runOnUiThread(() -> {
hideLoadingIndicator();
Toast.makeText(getContext(), "数据加载失败", Toast.LENGTH_SHORT).show();
});
}
});
}
}
private void hideLoadingIndicator() {
// 实际项目中应隐藏进度条
}
/**
* dp转px工具方法
*/
private int dpToPx(int dp) {
return (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
dp,
getResources().getDisplayMetrics()
);
}
}滚动指示器动画不要了 ,加入详细注释,
最新发布