在Android应用程序中动态创建和填充表

本文关键字:填充 创建 动态 Android 应用程序 | 更新日期: 2023-09-27 18:27:12

我想知道如何在Android中动态创建和填充TableLayout。我可以预先静态地(通过XML)创建表,但我需要能够在应用程序加载时用从服务器检索的数据集填充它。列数将始终相同,但行数将根据检索到的数据集而变化。

填充表格的最佳方法是什么?

在Android应用程序中动态创建和填充表

这是XML和代码,用于Xamarin.Android中的文件管理器活动。ListView由FileAdapter填充。FileAdapter保留FileSystemInfo对象的列表,这很好,因为DirectoryInfo和FileInfo类都是这种类型。你应该能领会要点ListView是如何通过这个例子工作的。我的例子有点复杂比你在Xamarin网站上看到的入门列表视图要多,因为列表视图并不是显示器内部的唯一视图。我有一些横向的按钮视图的顶部。这样用户就可以执行额外的命令。。很抱歉我无法包含图标。它们不是我的财产。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:minWidth="25px"
android:background="@drawable/splash_image"
android:minHeight="25px">
<LinearLayout
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:minWidth="25px"
    android:minHeight="25px">
    <ImageButton
        android:src="@drawable/undo"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:id="@+id/imageButton1" />
    <ImageButton
        android:src="@drawable/addfolder"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:id="@+id/imageButton3" />
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:minWidth="25px"
        android:minHeight="25px">
        <TextView
            android:id="@+id/folder"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:paddingTop="10dip"
            android:textColor="@android:color/white"
            android:textSize="20dip" />
    </LinearLayout>
</LinearLayout>
<ListView
    android:minWidth="25px"
    android:minHeight="25px"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@android:id/list" />

[Activity (Label = "Documents")]            
public class DocumentsActivity : ListActivity
{
    string path;
    ListView ourlist;
    TextView folder;
    ImageButton back;
    ImageButton home;
    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);
        SetContentView (Resource.Layout.DocumentsActivity);
        back = FindViewById<ImageButton> (Resource.Id.imageButton1);

        back.Click += delegate {
            this.BackClick();
        };
        back.LongClick += delegate {
            UserHelper.BackButton(this);
        };
        ourlist = FindViewById<ListView> (Android.Resource.Id.List);
        folder = FindViewById<TextView> (Resource.Id.folder);
        path = Android.OS.Environment.ExternalStorageDirectory.ToString();
        folder.Text = "Folder: "+new DirectoryInfo (path).Name;
        ourlist.Adapter = new FileAdapter (path, this);
    }
    private void CreateFolder(string path)
    {
        if (!Directory.Exists (path))
            Directory.CreateDirectory (path);
    }
    private void BackClick()
    {
        DirectoryInfo dir = new DirectoryInfo(path);
        ourlist.Adapter = new FileAdapter (dir.Parent.FullName, this);
        folder.Text = "Folder: "+dir.Parent.Name;
    } 
    protected override void OnListItemClick(ListView l, View v, int position, long id)
    {
        FileAdapter files = (FileAdapter)l.Adapter; 
        var t = files.Items[position];
        if (t is DirectoryInfo) {
        //Folder Behavior : 
            path = t.FullName;
            folder.Text = "Folder: "+t.Name;
            ourlist.Adapter = new FileAdapter (t.FullName,this);
        } else 
        {
        // File Behavior: (This is where will work will come in!)
            Android.Widget.Toast.MakeText (this, t.Name, Android.Widget.ToastLength.Short).Show ();
        }
    }
}

public class FileAdapter : BaseAdapter <FileSystemInfo>
{
    Activity _activity;
    string path;
    DirectoryInfo dir;
    public FileAdapter (string path,Activity act)
    {
        Items = new List<FileSystemInfo> ();
        dir = new DirectoryInfo (path);
        Items.AddRange (dir.GetDirectories().Where(z => !z.Name.StartsWith(".")).Cast<FileSystemInfo>().ToList());
        Items.AddRange (dir.GetFiles ());
        _activity = act;
    }
    public override FileSystemInfo this [int position] { 
        get { return Items[position]; }
    }
    public override int Count {
        get { return Items.Count() ; }
    }
    public override long GetItemId (int position)
    {
        return Items[position].GetHashCode();
    }
    public List<FileSystemInfo> Items {
        get;
        set;
    }
    public override View GetView (int position, View convertView, ViewGroup parent)
    {           
        View view = convertView; 
        if (view == null)
            view = _activity.LayoutInflater.Inflate (Resource.Layout.CustomView, null);
        if (Items [position] is DirectoryInfo) {
            ImageView imageview = view.FindViewById<ImageView> (Resource.Id.Image);
            imageview.SetImageResource (Resource.Drawable.Folder);
        } else {
            ImageView imageview = view.FindViewById<ImageView> (Resource.Id.Image);
            imageview.SetImageResource (Resource.Drawable.Files);
        }
        TextView text = view.FindViewById<TextView> (Resource.Id.Text1);
        text.Text = Items[position].Name;
        text.SetMinimumHeight (50);
        text.SetTextSize (Android.Util.ComplexUnitType.Pt, 10);
        return view;
    }
}