2013-09-05 25 views
7

ich versuche, etwas in listview mit arraylist und einfachen adapter zu zeigen. Ich habe versucht, etwas wie unten, aber in meinem Ergebnis zeigt die Nachnamen der Arraylist. Was ist falsch, kann ich nicht verstehen.listview mit arraylist, einfacher adapter in android

final ListView listView = (ListView) findViewById(R.id.mylist); 

    ArrayList<HashMap<String, String>> list_of_bookmarks = new ArrayList<HashMap<String, String>>(); 

     HashMap<String, String> b = new HashMap<String, String>(); 

     String[] from = { "php_key","c_key","android_key","hacking_key" }; 
     String[] name_of_bookmarks = { "php","c","android","hacking" }; 

      for(int i=0;i<4;i++) 
      { 
       b.put(from[i],name_of_bookmarks[i]); 
       list_of_bookmarks.add(b); 
      } 

     }; 

      int[] to = { R.id.txt1,R.id.txt1,R.id.txt1,R.id.txt1}; 

      SimpleAdapter adapter = new SimpleAdapter(getBaseContext(), list_of_bookmarks, R.layout.list_layout, from, to);   
      listView.setAdapter(adapter); 

Ich will nur zeigen, "php", "c", "Android", "Hacking" in einer Listenansicht. Und was sollte effizienter Weg, das zu tun.Ich bin ein Anfänger, so können Sie einen besseren Weg vorschlagen, die ich folgen sollte

+0

Seine Anzeige nur letzten Wert konfrontiert sind? –

+0

4 mal der letzte Wert wie "hacken, hacken, hacken, hacken" –

Antwort

7

main.xml

<LinearLayout 

    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="60dp" > 


    <ListView 
     android:id="@+id/zone_list" 
     android:layout_marginBottom="70dp" 
     android:background="@drawable/batteryborder" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 
    </ListView> 

</LinearLayout> 

setlanguage.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="60dp"> 

    <TextView 
     android:id="@+id/tvName" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:textSize="18dp" 
     android:gravity="center_vertical" /> 

</LinearLayout> 

in onCreate() Ihrer Aktivitätsdatei

ListView listView; 

String[] from = { "php_key","c_key","android_key","hacking_key" }; 

ArrayAdapter arrayAdapter; 

listView = (ListView) findViewById(R.id.zone_list); 

arrayAdapter = new ArrayAdapter(this,R.layout.setlanguage, R.id.tvName, from); 

listView.setAdapter(arrayAdapter); 
2

Sie verwenden die gleiche Ansicht in Ihrem Int [] -Objekt.

int[] to = { R.id.txt1,R.id.txt1,R.id.txt1,R.id.txt1};

Es sieht aus wie es sie alle als das gleiche Objekt zu behandeln, so dass jedes Mal fügt es ein neues Element es die vorhergehenden ändert.

Um die SimpleAdapter zu verwenden, müssen Sie jede Ansicht im XML mit verschiedenen IDs definieren.

int[] to = { R.id.txt1,R.id.txt2,R.id.txt3,R.id.txt4};

Die SimpleAdapter kann einfacher in Bezug sein, um es interne Komplexität, aber es ist auf jeden Fall tatsächlich nicht einfacher zu bedienen. Mit einer ArrayAdapter können Sie einfach die Liste der Elemente übergeben und lassen Sie sie automatisch generieren. Es kann eine beliebige Größe haben, die Sie benötigen, solange Sie nicht genug Speicher haben. (Siehe unten zum Beispiel)

Sobald Sie anfangen, mit benutzerdefinierten Adaptern zu arbeiten, empfehle ich Ihnen dringend, Romain Guy & Adam Powell's I/O talk zu sehen. Es ist alles eine Menge zu lernen, aber sie machen einen tollen Job zu erklären, wie ListViews arbeiten.

//List of Items 
String[] name_of_bookmarks = { "php","c","android","hacking" }; 

//Create your List object for the ArrayAdapter 
//and make it the same size as name_of_books 
List<String> listBookmarks = new ArrayList<String>(Array.getLength(name_of_bookmarks)); 

//Add name_of_bookmarks contents to listBookmarks 
Collections.addAll(listBookmarks, name_of_books); 

//Create an ArrayAdapter passing it the Context, a generic list item and your list 
//An alternative to "this" would be "getApplicationContext()" from your main activity 
//or "getActivity()" from a fragment. "getBaseContext()" is not recommended. 
ArrayAdapter arrayAdapter = new ArrayAdapter(this, R.layout.list_item_text, listBookmarks); 

//Set the adapter to your ListView 
final ListView listView = (ListView) findViewById(R.id.mylist); 
listView.setAdapter(arrayAdapter); 
+0

Ja, guter Punkt. Er benutzt dasselbe Objekt. –

+0

Also was soll ich tun ?? @ Jon –

+0

Verwenden Sie unterschiedliche Textansichten für jeden. –

0

Versuchen Sie dieses

public class MyFragment extends ListFragment{ 

    String[] from = { "php_key","c_key","android_key","hacking_key" }; 
    String[] name_of_bookmarks = { "php","c","android","hacking" }; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     List<HashMap<String, String>> list= new ArrayList<HashMap<String,String>>(); 

     for (int i = 0; i < name_of_bookmarks.length; i++) { 

      HashMap<String, String> map= new HashMap<String, String>(); 
      map.put("key", name_of_bookmarks[i]); 
      list.add(map); 
     } 
     String[] from = { "key" }; 

     int[] to = { R.id.txt}; 

     SimpleAdapter adapter = new SimpleAdapter(getActivity().getBaseContext(), list, R.layout.list_layout, from, to); 
     setListAdapter(adapter); 

     return super.onCreateView(inflater, container, savedInstanceState); 
    } 

} 
+0

text1 ist eine Textansicht im Layout, so dass ich den Namen in einer Textansicht anzeigen kann –

+0

So ist es möglich, in textveiw –

+0

zu zeigen, warum sollte ich eine andere Textansicht als R.id.txt2 –

9

Mein Rat an Sie wäre, eine eigene Klasse zu erstellen, die den Adapter (oder eine Unterklasse davon) erstreckt

Hier ist ein einfaches Beispiel für eine String-Array-Adapter.

package ro.gebs.captoom.adapters; 

import android.content.Context; 
import android.view.View; 
import android.view.ViewGroup; 
import antistatic.spinnerwheel.adapters.AbstractWheelTextAdapter; 

import com.example.captoom.R; 

public class LanguagesAdapter extends AbstractWheelTextAdapter { 
    // Countries names 
    private String languages[]; 

    public LanguagesAdapter(Context context) { 
     super(context, R.layout.lang_item, NO_RESOURCE); 
     languages = context.getResources().getStringArray(R.array.lang_array); 
     setItemTextResource(R.id.language_txt); 
    } 

    @Override 
    public View getItem(int index, View cachedView, ViewGroup parent) { 
     View view = super.getItem(index, cachedView, parent); 
     return view; 
    } 

    @Override 
    public int getItemsCount() { 
     return languages.length; 
    } 

    @Override 
    protected CharSequence getItemText(int index) { 
     return languages[index]; 
    } 
} 

und die Nutzung ist einfach nur die Methode verwendet .setAdapter();

Oder ein anderes Beispiel, das eine arrayAdapter verwendet:

package apc.example; 

import java.util.ArrayList; 

import utils.BitmapManager; 
import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class PersonAdapter extends ArrayAdapter<Person> { 

    Context context; 
    int layoutResourceId; 
    ArrayList<Person> data = null; 

    public PersonAdapter(Context context, int layoutResourceId, 
      ArrayList<Person> data) { 
     super(context, layoutResourceId, data); 
     this.layoutResourceId = layoutResourceId; 
     this.context = context; 
     this.data = data; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     ItemHolder holder = null; 

     if (row == null) { 
      LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      holder = new ItemHolder(); 
      holder.imgIcon = (ImageView) row.findViewById(R.id.icon); 
      holder.txtName = (TextView) row.findViewById(R.id.title); 
      holder.txtDescription = (TextView) row.findViewById(R.id.desc); 

      row.setTag(holder); 
     } else { 
      holder = (ItemHolder) row.getTag(); 
     } 

     Person bean = data.get(position); 
     holder.txtName.setText(bean.getName()); 
     holder.txtDescription.setText(bean.getDescription()); 


     Bitmap b = BitmapFactory.decodeResource(context.getResources(), R.drawable.user); 
     BitmapManager.INSTANCE.setPlaceholder(b); 
     BitmapManager.INSTANCE.loadBitmap(bean.getUrl(), holder.imgIcon, 80, 80); 

     return row; 
    } 

    public static class ItemHolder { 
     public ImageView imgIcon; 
     TextView txtName; 
     TextView txtDescription; 
    } 

    public void updateAdapter(ArrayList<Person> pers){ 
     this.data = pers; 
    } 
} 

Dies ist ein Beispiel eines Adapters für eine komplexere Klasse, die hat mehr Felder als eine einfache Zeichenfolge. Aber das kann leicht zu ArrayAdapter<String> geändert werden und dann von dort gehen.

Anyways denke ich, es ist immer eine Best Practice, um Ihre benutzerdefinierten Adapter für Listenansichten zu schreiben.

Hoffe, das hilft!

+0

+ 1 für benutzerdefinierte Adapter mit ViewHolder Pattern! Es ist ein wertvolles Beispiel. – naXa

-1

Was auch immer Sie Genau Gesicht Problem Ich bin auf Gesicht des Problems Called „Liste View Display letzte Position Daten eines Arrays ... "

Das Problem wird mit Hash-Karte generiert

final ListView listView = (ListView) findViewById(R.id.mylist); 

ArrayList<HashMap<String, String>> list_of_bookmarks = new ArrayList<HashMap<String, String>>(); 

    String[] from = { "php_key","c_key","android_key","hacking_key" }; 
    String[] name_of_bookmarks = { "php","c","android","hacking" }; 

     for(int i=0;i<4;i++) 
     { 
      HashMap<String, String> b = new HashMap<String, String>(); 
      b.put(from[i],name_of_bookmarks[i]); 
      list_of_bookmarks.add(b); 
     } 

    }; 

     int[] to = { R.id.txt1,R.id.txt1,R.id.txt1,R.id.txt1}; 

     SimpleAdapter adapter = new SimpleAdapter(getBaseContext(), list_of_bookmarks, R.layout.list_layout, from, to);   
     listView.setAdapter(adapter); 

Versuchen Sie dieses heraus Wenn irgendein Zweifel in Ihrem Verstand Erstellt Dann fragen mich auch immer wieder Frage Simply You To erklärt Ihre Hash Karte haben im Inneren des For-Schleife ...

Hash Karte verwenden Innerhalb Ihrer For-Schleife Variable 'b' Erstellt jeweils & jedes Mal als ein anderes Objekt betrachtet. Und dann einfach Array List Display verschiedene Objekte der Hash Map.

Sie verwenden gleiches Objekt zu speichern Wert von Hash-Karte und Das Variable wurde außer Kraft setzt mit dem gleichen Namen Deshalb sollen Sie das Problem Danke ...

Verwandte Themen