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

Xamarin Android中如何获取Table Layout内表格行的选中值

嘿,作为Xamarin Android初学者,想要获取TableLayout里特定行的数据其实没那么复杂,我来给你梳理两种靠谱的方法,帮你快速搞定!

获取TableLayout特定行数据的两种方法

方法一:直接从Adapter数据源获取(推荐)

你的Adapter已经持有了绑定的数据源List<CaseDetails> _cases,这是最可靠的数据来源,直接通过行的位置(position)就能拿到对应的数据,完全不用去操作TableLayout的控件,避免布局变化带来的问题。

比如在Adapter的GetView方法中给TableRow添加点击事件,直接获取对应位置的数据:

public override View GetView(int position, View convertView, ViewGroup parent)
{
    // 加载行布局(替换成你的行布局ID)
    var view = convertView ?? context.LayoutInflater.Inflate(Resource.Layout.CaseRowLayout, parent, false);
    
    // 获取当前行绑定的数据源
    CaseDetails currentCase = _cases[position];
    
    // 找到当前行的TableRow
    TableRow row = view as TableRow;
    
    // 给行添加点击事件,点击时直接取数据源里的数据
    row.Click += (sender, e) =>
    {
        // 这里就是你要的特定行数据啦
        string caseId = currentCase.CaseId;
        string caseDesc = currentCase.Description;
        
        // 测试输出,替换成你的业务逻辑
        Toast.MakeText(context, $"选中案件ID:{caseId}", ToastLength.Short).Show();
    };
    
    // 绑定数据到行内的控件(示例)
    TextView caseIdTv = view.FindViewById<TextView>(Resource.Id.tv_case_id);
    caseIdTv.Text = currentCase.CaseId;
    
    TextView caseDescTv = view.FindViewById<TextView>(Resource.Id.tv_case_desc);
    caseDescTv.Text = currentCase.Description;
    
    return view;
}

如果是在Activity中想要主动获取某一行的数据,只要拿到Adapter的实例,直接访问数据源即可:

// 假设adapter是你的CaseDetailsAdapter实例,要获取第3行(索引从0开始,所以是2)的数据
CaseDetails targetCase = adapter._cases[2];
// 访问数据属性
Console.WriteLine($"案件名称:{targetCase.CaseName}");

方法二:从TableLayout控件中提取数据

如果你已经持有了TableLayout的引用(比如你Adapter里的_tbLayout),也可以通过索引直接定位到TableRow,再从中提取控件的数据。不过这种方法要注意TableLayout的子元素可能包含非TableRow的控件(比如分隔线),需要做类型判断:

// 假设要获取第2行(索引为1)的数据
int targetRowIndex = 1;
if (_tbLayout.ChildCount > targetRowIndex)
{
    // 获取目标行,确保是TableRow类型
    TableRow targetRow = _tbLayout.GetChildAt(targetRowIndex) as TableRow;
    if (targetRow != null)
    {
        // 通过控件索引获取(比如第1个控件是案件ID的TextView)
        TextView caseIdTv = targetRow.GetChildAt(0) as TextView;
        if (caseIdTv != null)
        {
            string caseId = caseIdTv.Text;
            Console.WriteLine($"提取到的案件ID:{caseId}");
        }
        
        // 或者通过控件ID获取(更稳定,推荐)
        TextView caseDescTv = targetRow.FindViewById<TextView>(Resource.Id.tv_case_desc);
        if (caseDescTv != null)
        {
            string caseDesc = caseDescTv.Text;
            Console.WriteLine($"提取到的案件描述:{caseDesc}");
        }
    }
}

优化建议:避免静态变量,用回调解耦

注意你的Adapter里把_tbLayout设为public static是不太好的,容易造成内存泄漏。推荐用回调接口来处理行点击事件,让Activity或Fragment自己处理数据逻辑:

首先在Adapter里定义一个回调接口:

public interface OnCaseRowClickListener
{
    void OnCaseRowClicked(CaseDetails selectedCase);
}

// 在Adapter里添加回调属性
public OnCaseRowClickListener RowClickListener { get; set; }

然后在GetView的点击事件中调用回调:

row.Click += (sender, e) =>
{
    // 触发回调,把选中的数据传递出去
    RowClickListener?.OnCaseRowClicked(currentCase);
};

最后在Activity中设置Adapter时绑定回调:

List<CaseDetails> caseList = // 你的数据源
var adapter = new CaseDetailsAdapter(this, caseList);
adapter.RowClickListener = (selectedCase) =>
{
    // 在这里处理选中的数据,比如展示详情
    Toast.MakeText(this, $"选中案件:{selectedCase.CaseName}", ToastLength.Short).Show();
};

// 把Adapter绑定到你的ListView或TableLayout(如果是手动添加行的话)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:18:30