我想知道如何在Android中动态创建和填充TableLayout。我可以预先静态地创建表(通过XML)但我需要能够在应用程序加载时使用从服务器检索的数据集填充它。列数始终相同,但行数将根据检索的数据集而变化。
填充表格的最佳方式是什么?
答案 0 :(得分: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;
}
}