0

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

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

4

1 回答 1

1

这是 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;
    }
}
于 2013-08-10T15:26:43.603 回答