2017-05-03 1 views
0

Es ist meine erste Anwendung in Xamarin für Android. Ich möchte mit zwei Bildschirmen beginnen:ListView zum Herunterladen von Dateien in Xamarin

  • ersten (Haupt-) Bildschirm mit 3 Tasten: Last Task-Nummer 1, Last Task-Nummer 2, Anzeige der Aufgabenliste
  • nach dem Drücken ersten oder zweiten Knopf, der Artikel ist hinzugefügt, um in der Liste im zweiten Bildschirm,
  • nach Drücken der dritten Schaltfläche, zweiten Bildschirm mit Aufgaben Liste geöffnet ist.

Aber ich habe ein Problem mit ListView. Zum Beispiel: Ich möchte die erste Aufgabe zu ListView hinzufügen, zurück zum ersten Bildschirm, zweite Aufgabe hinzufügen (die erste Aufgabe sollte bereits in der Liste sein), zurück zum ersten Bildschirm, den zweiten Bildschirm drücken und zwei Aufgaben sollten schon da sein.

Haupttätigkeit:

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); 
     }; 
    } 
} 

Aktivität mit Aufgaben:

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(); 
    } 
} 

Wie kann ich es beheben? Eine solche Liste ist eine gute Möglichkeit, heruntergeladene Dateien anzuzeigen? In Zukunft möchte ich ProgressBar zu jedem Element in ListView hinzufügen. Bitte senden Sie keine Links zu Tutorials, ich habe sie alle gesehen. Ich kümmere mich um Informationen von Leuten, die damit umgehen.

Antwort

1

Wie kann ich es beheben? Eine solche Liste ist eine gute Möglichkeit, heruntergeladene Dateien anzuzeigen?

nicht sicher, warum, ich habe Ausnahme ohne Informationen, wenn eine neue Tätigkeit beginnen, die von ListActivity erbt wie Sie in Ihrem Code haben, so dass ich entscheiden, eine normales Activity mit einer ListView Kontrolle in seinem Layout zum Beispiel zu verwenden:

downloadslayout.axml:

<?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> 

Normalerweise, wenn Ihr Downloads erbt von ListActivity, müssen wir ListAdapter setzen, wenn Sie also nicht die gleiche Ausnahme wie ich bekommen kann, yo u müssen einen solchen Code hinzuzufügen:

ListAdapter = lista; 

im OnCreate von Downloads.

Aber für meine Methode müssen wir zuerst diese ListView in DownloadsLayout finden und setzen Sie dann ihren Adapter, sie sind tatsächlich die gleichen.

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; 
} 

In Zukunft I ProgressBar zu jedem Element in Listview hinzufügen möchten.

Also für Ihre Zukunft Absicht, ich glaube ein hier nicht verwenden ArrayAdapter direkt eine gute Methode ist, können wir unsere eigenen Adapter, in der Zwischenzeit passen Sie Ihre ListView Zelle in der GetView Methode von Adapter anpassen können, nur zum Beispiel:

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; 
    } 
} 

Und die downloadscell.axml ist zum Beispiel wie folgt aus:

<?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> 

von c hecking Ihren Code, Sie scheinen nur Strings zu jedem Element zu übergeben, so dass ich BaseAdapter<string> hier verwendet, können Sie auf andere Typen ändern, wenn Sie möchten. Und schließlich in Ihrem OnCreate:

protected override void OnCreate(Bundle savedInstanceState) 
{ 
    base.OnCreate(savedInstanceState); 
    SetContentView(Resource.Layout.downloadslayout); 

    ListView lv = FindViewById<ListView>(Resource.Id.listview); 
    var adapter = new DownloadsAdapter(this, listaZadan); 
    lv.Adapter = adapter; 
} 
Verwandte Themen