哪个是在Xamarin.Android中显示带有数据的动态表的最佳小部件?

时间:2018-01-30 13:21:16

标签: xamarin.android

我必须显示下表:

enter image description here

所以我想知道什么是用于表的最佳小部件。我希望表格是动态的我的意思是,如果我从下拉列表中选择其他组,表格中的项目数量会增加或减少,总价格会根据我的列价格而变化。什么小部件是实现这一目标的最佳小部件?

1 个答案:

答案 0 :(得分:1)

RecyclerView是实现它的最佳UI控件。因为RecyclerView是适配器模式,所以您可以使用适配器来实现您所说的dynamic

  

我希望表格是动态的我的意思是,如果我从下拉列表中选择其他组,表格中的项目数量会增加或减少,总价格会根据我的列价格而变化

我为您制作了一个演示,您可以对其进行测试并对您的项目进行一些更改:

三个.axml文件:

Main.axml

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

  <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:orientation="horizontal"
       >
    <Button
      android:id="@+id/bt1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="group1"/>
    <Button
      android:id="@+id/bt2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="group2"/>
    <Button
      android:id="@+id/bt3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="group3"
      />
  </LinearLayout>
  <android.support.v7.widget.RecyclerView
      android:id="@+id/rv"
      android:layout_width="match_parent"
      android:layout_height="match_parent">

  </android.support.v7.widget.RecyclerView>

</LinearLayout>

item_layout,每个项目的布局:

<?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">
    <TextView
        android:id="@+id/item_tv"
        android:layout_width="match_parent"
        android:textSize="30dp"
        android:layout_height="wrap_content" />

</LinearLayout>

item_layout,总价格布局:

<?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">
    <TextView
        android:id="@+id/foot_tv"
        android:gravity="end"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

MainActivity

using Android.App;
using Android.Widget;
using Android.OS;
using System;
using System.Collections.Generic;
using Android.Support.V7.Widget;
using Android.Views;
using Android.Content;

namespace RecycleTest
{
    [Activity(Label = "RecycleTest", MainLauncher = true)]
    public class MainActivity : Activity
    {
        RecyclerView mRecyclerView;
        MyAdapter adapter;
        Button bt1, bt2, bt3;
        List<double> list1, list2, list3;
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);
            initView();
            initData();

            mRecyclerView = FindViewById<RecyclerView>(Resource.Id.rv);
            mRecyclerView.SetLayoutManager(new LinearLayoutManager(this));
            adapter = new MyAdapter(this, list1);
            mRecyclerView.SetAdapter(adapter);
        }

        private void initData()
        {
            list1 = new List<double>();
            list2 = new List<double>();
            list3 = new List<double>();
            list1.Add(1.1);
            list1.Add(1.2);
            list1.Add(1.3);

            list2.Add(2.1);
            list2.Add(2.2);
            list2.Add(2.3);
            list2.Add(2.4);

            list3.Add(3.1);
            list3.Add(3.2);
            list3.Add(3.3);
            list3.Add(3.4);
            list3.Add(3.5);
        }

        public void initView() {
            bt1 = FindViewById<Button>(Resource.Id.bt1);
            bt2 = FindViewById<Button>(Resource.Id.bt2);
            bt3 = FindViewById<Button>(Resource.Id.bt3);

            bt1.Click += Bt1_Click;
            bt2.Click += Bt2_Click;
            bt3.Click += Bt3_Click;

        }

        private void Bt3_Click(object sender, System.EventArgs e)
        {
            adapter.change(list3);
        }

        private void Bt2_Click(object sender, System.EventArgs e)
        {
            adapter.change(list2);
        }

        private void Bt1_Click(object sender, System.EventArgs e)
        {
            adapter.change(list1);
        }
    }
    class MyViewHolder : RecyclerView.ViewHolder
    {
        public TextView mtv;
        public MyViewHolder(View itemView): base(itemView)
        {
            mtv = itemView.FindViewById<TextView>(Resource.Id.item_tv);
        }
    }

    class MyFootViewHolder : RecyclerView.ViewHolder
    {
        public TextView mtv;
        public MyFootViewHolder(View itemView):base(itemView)
        {
            mtv = itemView.FindViewById<TextView>(Resource.Id.foot_tv);
        }
    }


    class MyAdapter :RecyclerView.Adapter{

        Context mContext;
        List<double> mList=new List<double>();

        public override int ItemCount => mList.Count + 1;

        public MyAdapter(Context context, List<Double> list)
    {
        this.mContext = context;
        this.mList.AddRange(list);
    }

        public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
        {
            if (GetItemViewType(position) == 0)
            {

                ((MyViewHolder)holder).mtv.Text=(mList[position].ToString());
            }
            else
            {
                double price = 0;
                for (int i = 0; i < mList.Count; i++)
                {
                    price += mList[i];
                }
              ((MyFootViewHolder)holder).mtv.Text=price + "";
            }
        }

        public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
        {
            RecyclerView.ViewHolder holder;
            if (viewType == 0)
            {
                holder = new MyViewHolder(LayoutInflater.From(mContext).Inflate(Resource.Layout.item_layout, parent, false));
            }
            else
            {
                holder = new MyFootViewHolder(LayoutInflater.From(mContext).Inflate(Resource.Layout.foot_layout, parent, false));
            }
            return holder;
        }

        public override int GetItemViewType(int position)
        {
            int type;
            if (position != mList.Count)
            {
                type = 0;
            }
            else
            {
                type = 1;
            }
            return type;
        }

    public void change(List<Double> list1)
    {
        mList.Clear();
        mList.AddRange(list1);
        NotifyDataSetChanged();
    }


    }
}