ListView用于下载Xamarin中的文件

时间:2017-05-03 10:40:36

标签: c# android listview xamarin

这是我在Xamarin for Android中的第一个应用程序。我想从两个屏幕开始:

  • 第一个(主)屏幕,带3个按钮:加载任务编号1,加载任务编号2,显示任务列表,
  • 按下第一个或第二个按钮后,该项目将被添加到第二个屏幕的列表
  • 按下第三个按钮后,打开带有任务列表的第二个屏幕。

但我有ListView的问题。例如:我想将第一个任务添加到ListView,返回第一个屏幕,添加第二个任务(第一个任务应该已经在列表中),返回第一个屏幕,按钮显示第二个屏幕,两个任务应该已经存在。

主要活动:

public class MainActivity : Activity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SetContentView(Resource.Layout.Main);
        Button addButton1 = FindViewById<Button>(Resource.Id.AddButton1);
        Button addButton2 = FindViewById<Button>(Resource.Id.AddButton2);
        Button downloadsScreen = FindViewById<Button>(Resource.Id.DownloadsScreen);
        var intent = new Intent(this, typeof(Downloads));

        addButton1.Click += (object sender, EventArgs e) =>
        {
            intent.PutExtra("downloads", "wartosc1");
            StartActivity(intent);
        };

        addButton2.Click += (object sender, EventArgs e) =>
        {
            intent.PutExtra("downloads", "wartosc2");
            StartActivity(intent);
        };

        downloadsScreen.Click += (object sender, EventArgs e) =>
        {
            StartActivity(intent);
        };
    }
}

活动与任务:

public class Downloads : ListActivity
{
    Dictionary<string, Task> zadania = new Dictionary<string, Task>();
    List<string> listaZadan = new List<string>();

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        ArrayAdapter<string> lista = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1, listaZadan);
    }

    protected override void OnStart()
    {
        var download = Intent.GetStringExtra("downloads") ?? null;
        Task zadanie = new Task();
        EncryptAndDecrypt decryption = new EncryptAndDecrypt();
        zadanie = JsonConvert.DeserializeObject<Task>(decryption.Decrypt(download, "haslo"));
        if (!zadania.ContainsKey(zadanie.Name))
        {
            zadania.Add(zadanie.Name, zadanie);
            listaZadan.Add(zadanie.Name);
        }
        else
            new AlertDialog.Builder(this).SetMessage("Zadanie zostało już dodane do pobierania").Show();
    }
}

我该如何解决?这样的列表是显示下载文件的好方法吗?在将来,我想将ProgressBar添加到ListView中的每个项目。请不要发送教程链接,我看到了所有内容。我关心处理它的人的信息。

1 个答案:

答案 0 :(得分:1)

  

我该如何解决?这样的列表是显示下载文件的好方法吗?

不确定原因,我在开始一个像你在代码中那样继承ListActivity的新活动时没有任何信息,因此我决定使用{{1}的普通Activity例如,在其布局中控制:

downloadslayout.axml:

ListView

通常当您的<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#00FF00" android:layout_weight="1" android:drawSelectorOnTop="false" /> </LinearLayout> 继承自Downloads时,我们需要设置ListActivity,因此如果您没有获得与我相同的例外,则需要添加以下代码:

ListAdapter
<{1}} ListAdapter = lista; 中的

但是对于我的方法,我们首先需要在OnCreate中找到这个Downloads,然后设置它的适配器,它们实际上是相同的。

ListView
  

将来我想将ProgressBar添加到ListView中的每个项目。

因此,对于您未来的意图,我不认为直接使用DownloadsLayout是一种很好的方法,我们可以自定义我们自己的适配器,同时您可以自定义protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.downloadslayout); ListView lv = FindViewById<ListView>(Resource.Id.listview); ArrayAdapter<string> lista = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1, listaZadan); lv.Adapter = lista; } 单元格。 ArrayAdapter的{​​{1}}方法,例如:

ListView

GetView就是这样的:

Adapter

通过检查您的代码,您似乎只想将字符串传递给每个项目,因此我在此使用public class DownloadsAdapter : BaseAdapter<string> { private List<string> items = new List<string>(); private Activity context; public DownloadsAdapter(Activity context, List<string> items) : base() { this.context = context; this.items = items; } public override string this[int position] { get { return items[position]; } } public override int Count { get { return items.Count; } } public override long GetItemId(int position) { return position; } public override View GetView(int position, View convertView, ViewGroup parent) { View view = convertView; // re-use an existing view, if one is available if (view == null) { // otherwise create a new one view = context.LayoutInflater.Inflate(Resource.Layout.downloadscell, null); } var pbar = view.FindViewById<ProgressBar>(Resource.Id.progressbar); var tv = view.FindViewById<TextView>(Resource.Id.tv); tv.Text = items[position]; return view; } } ,您可以根据需要更改为其他类型。最后在你的downloadscell.axml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
  <ProgressBar
    android:id="@+id/progressbar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    style="@android:style/Widget.ProgressBar.Small"
    android:layout_marginRight="5dp" />
  <TextView
      android:id="@+id/tv"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="@string/loading" />
</LinearLayout>