我遇到了问题,我工作了10天就无法解决。我为ListView的每一行做了一个布局。这个布局包含一个有一个TextView和一个的LinearLayout它里面的WebView。现在我需要一个C#项目,我可以随时使用新文本和url向ListView添加新行。例如:button.click {ListView.add(Resource.Layout.Items,"文字"," Url")} ..我知道这个命令是错误的。我想为你解决问题。 我知道它的自定义行布局,我在这个站点的其他站点和Xamarin站点上阅读了manny示例,关于它,适配器,......但是我无法做到。 :( 请正确回答我。 这对我来说非常重要。 非常感谢。
答案 0 :(得分:0)
您需要创建一个可以将自定义对象作为项目使用的适配器。它可能如下所示:
public class MyAdapter : BaseAdapter<MyItem>
{
readonly LayoutInflater inflater;
List<MyItem> myItemList;
public MyAdapter(Context context)
{
inflater = LayoutInflater.FromContext(context);
myItemList = YOUR_DATASOURCE.GetMyItems();
}
public override MyItem this [int index]
{
get { return myItemList[index]; }
}
public override int Count
{
get { return myItemList.Count; }
}
public override long GetItemId(int position)
{
return position;
}
public override View GetView(int position, View convertView, ViewGroup parent)
{
View view = convertView ?? inflater.Inflate(Resource.Layout.MyItemLayout, parent, false);
var item = myItemList[position];
var viewHolder = view.Tag as MyViewHolder;
if (viewHolder == null)
{
viewHolder = new MyViewHolder();
viewHolder.Web = view.FindViewById<WebView>(Resource.Id.MyItemLayout_Icon);
viewHolder.Name = view.FindViewById<TextView>(Resource.Id.MyItemLayout_Title);
view.Tag = viewHolder;
}
viewHolder.Web.Url = item.Url; //You need to check how you have to set the url for a WebView
viewHolder.Name.Text = item.Text;
return view;
}
public override void NotifyDataSetChanged()
{
myItemList = YOUR_DATASOURCE.GetMyItems();
base.NotifyDataSetChanged();
}
}
class MyViewHolder : Java.Lang.Object
{
public WebView Web { get; set; }
public TextView Name { get; set; }
}
您使用ListView.Adapter = new MyAdapter(Activity);
将适配器应用于ListView。每次更改按钮单击事件中的项目时,都会拖动(ListView.Adapter as MyAdapter).NotifyDataSetChanged();
,这会强制适配器重新加载并刷新数据。
YOUR_DATASOURCE表示代码中存储所有项目的网址或文字等信息的位置。这通常可以是数据库或类似的东西。而GetMyItems()是一种查询数据库的方法。
希望这可以解决问题。