You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求Android Studio Java实现C# WinForms DataGridView等效可排序表格方案

Android 实现可排序表头的表格(类似C# WinForms绑定方式)

1. 创建实体类(对应C#的Model)

和WinForms里的实体类逻辑一致,封装数据字段和Getter/Setter:

public class User {
    private String name;
    private int age;
    private String email;

    public User(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
}

2. 编写布局文件

主布局(activity_main.xml)

包含可点击排序的表头和表格内容区域:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <!-- 可点击排序的表头 -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#f0f0f0"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/tv_name_header"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:padding="16dp"
            android:text="姓名"
            android:textStyle="bold"
            android:clickable="true"
            android:gravity="center"/>

        <TextView
            android:id="@+id/tv_age_header"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:padding="16dp"
            android:text="年龄"
            android:textStyle="bold"
            android:clickable="true"
            android:gravity="center"/>

        <TextView
            android:id="@+id/tv_email_header"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:padding="16dp"
            android:text="邮箱"
            android:textStyle="bold"
            android:clickable="true"
            android:gravity="center"/>
    </LinearLayout>

    <!-- 表格内容展示区域 -->
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

表格行布局(item_table_row.xml)

定义单行数据的展示样式:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="16dp"
    android:borderBottomWidth="1dp"
    android:borderBottomColor="#e0e0e0">

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center"/>

    <TextView
        android:id="@+id/tv_age"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center"/>

    <TextView
        android:id="@+id/tv_email"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center"/>

</LinearLayout>

3. 自定义Adapter(绑定数据源到表格)

类似WinForms中DataGridView的数据源绑定逻辑,通过Adapter将List<User>数据映射到表格行:

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;

public class TableAdapter extends RecyclerView.Adapter<TableAdapter.TableViewHolder> {
    private List<User> userList;

    public TableAdapter(List<User> userList) {
        this.userList = userList;
    }

    // 更新数据源并刷新表格
    public void updateData(List<User> newList) {
        this.userList = newList;
        notifyDataSetChanged();
    }

    @NonNull
    @Override
    public TableViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_table_row, parent, false);
        return new TableViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull TableViewHolder holder, int position) {
        User user = userList.get(position);
        holder.tvName.setText(user.getName());
        holder.tvAge.setText(String.valueOf(user.getAge()));
        holder.tvEmail.setText(user.getEmail());
    }

    @Override
    public int getItemCount() {
        return userList.size();
    }

    static class TableViewHolder extends RecyclerView.ViewHolder {
        TextView tvName, tvAge, tvEmail;

        public TableViewHolder(@NonNull View itemView) {
            super(itemView);
            tvName = itemView.findViewById(R.id.tv_name);
            tvAge = itemView.findViewById(R.id.tv_age);
            tvEmail = itemView.findViewById(R.id.tv_email);
        }
    }
}

4. 主逻辑实现(数据源初始化+排序功能)

在MainActivity中完成数据源准备、Adapter绑定,以及表头点击排序的逻辑:

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private TableAdapter adapter;
    private List<User> userList;
    // 记录各列排序状态:true=升序,false=降序
    private boolean isNameAsc = true;
    private boolean isAgeAsc = true;
    private boolean isEmailAsc = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化模拟数据
        initData();

        // 绑定RecyclerView和Adapter
        recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        adapter = new TableAdapter(userList);
        recyclerView.setAdapter(adapter);

        // 绑定表头点击排序事件
        bindHeaderClickEvents();
    }

    private void initData() {
        userList = new ArrayList<>();
        userList.add(new User("张三", 25, "zhangsan@example.com"));
        userList.add(new User("李四", 30, "lisi@example.com"));
        userList.add(new User("王五", 22, "wangwu@example.com"));
        userList.add(new User("赵六", 28, "zhaoliu@example.com"));
    }

    private void bindHeaderClickEvents() {
        TextView tvNameHeader = findViewById(R.id.tv_name_header);
        TextView tvAgeHeader = findViewById(R.id.tv_age_header);
        TextView tvEmailHeader = findViewById(R.id.tv_email_header);

        // 姓名列排序
        tvNameHeader.setOnClickListener(v -> {
            if (isNameAsc) {
                Collections.sort(userList, (u1, u2) -> u2.getName().compareTo(u1.getName()));
            } else {
                Collections.sort(userList, Comparator.comparing(User::getName));
            }
            isNameAsc = !isNameAsc;
            adapter.updateData(userList);
        });

        // 年龄列排序
        tvAgeHeader.setOnClickListener(v -> {
            if (isAgeAsc) {
                Collections.sort(userList, (u1, u2) -> Integer.compare(u2.getAge(), u1.getAge()));
            } else {
                Collections.sort(userList, Comparator.comparingInt(User::getAge));
            }
            isAgeAsc = !isAgeAsc;
            adapter.updateData(userList);
        });

        // 邮箱列排序
        tvEmailHeader.setOnClickListener(v -> {
            if (isEmailAsc) {
                Collections.sort(userList, (u1, u2) -> u2.getEmail().compareTo(u1.getEmail()));
            } else {
                Collections.sort(userList, Comparator.comparing(User::getEmail));
            }
            isEmailAsc = !isEmailAsc;
            adapter.updateData(userList);
        });
    }
}

实现说明

  • 用Android原生的RecyclerView替代WinForms的DataGridView,是当前Android实现列表/表格的标准方案
  • 实体类、List数据源的用法和C# WinForms完全一致,符合你的使用习惯
  • 表头点击切换升降序,排序后通过Adapter的updateData方法刷新表格,逻辑简洁直观

内容的提问来源于stack exchange,提问作者UNN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 10:51:11