2013-09-05 10 views
7

Próbuję pokazać coś w widoku listy przy użyciu listy tablic i prostego adaptera. Próbowałem coś jak poniżej, ale w moim wyniku pokazuje nazwiska z listy arraylist. Co jest moje złe, nie mogę zrozumieć.listview z tablicą, prosty adapter w Androidzie

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

Po prostu chcę pokazać "php", "c", "android", "hakowanie" w widoku listy. A jaki powinien być bardziej efektywny sposób na to. Jestem początkującym, więc możesz zaproponować lepszy sposób, który powinienem wykonać podając

+0

wyświetlaczem tylko ostatnią wartość? –

+0

4 razy ostatnia wartość, np. "Hakowanie, hakowanie, hakowanie, hakowanie" –

Odpowiedz

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> 

dodać onCreate() z pliku aktywności

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

Używasz tego samego widoku w swoim obiekcie int [].

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

Wygląda na to traktując je wszystkie jako tego samego obiektu, więc za każdym razem dodaje nowy element zmienia poprzednich.

Aby korzystać z SimpleAdapter, musisz zdefiniować każdy widok w pliku XML z różnymi identyfikatorami.

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

The SimpleAdapter może być prostsze w odniesieniu do jego wewnętrznej złożoności, ale nie jest to zdecydowanie prostsze faktycznie korzysta. Dzięki ArrayAdapter możesz po prostu przekazać listę przedmiotów i automatycznie wygenerować widoki. Może mieć dowolną wielkość, o ile nie zabraknie Ci pamięci. (Zobacz poniżej przykład)

Po rozpoczęciu pracy z niestandardowymi adapterami zdecydowanie polecam obejrzeć Romain Guy & Adam Powell's I/O talk. Podczas nauki wiele się przydaje, ale świetnie sprawdzają się, jak działają ListViews.

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

Tak, słusznie. Używa tego samego obiektu. –

+0

Co powinienem zrobić? @ Jon –

+0

Używaj różnych odsłon dla każdego z nich. –

0

Spróbuj ten

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 to widok tekstowy w układzie, dzięki czemu mogę wyświetlić nazwę w wyglądzie tekstowym. –

+0

. Tak więc można wyświetlić w textveiw –

+0

, dlaczego powinienem wziąć inny widok tekstowy jako R.id.txt2 –

9

Moja rada dla Ciebie byłoby, aby utworzyć osobną klasę, która rozszerza sieciowego (lub jakiś podklasę IT)

Oto prosty przykład z Adapter sznurowy.

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

i użycie jest proste, wystarczy użyć metody .setAdapter();

Albo inny przykład, który używa arrayAdapter:

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

To jest przykład z adapterem do bardziej złożonego klasy, która ma więcej pól niż prosty ciąg. Ale można to łatwo zmienić na ArrayAdapter<String>, a następnie przejść dalej.

W każdym razie uważam, że zawsze najlepiej jest pisać niestandardowe adaptery do odsłon list.

Mam nadzieję, że to pomoże!

+0

+ 1 dla niestandardowego adaptera ze wzorem ViewHolder! To cenny przykład. – naXa

-1

Cokolwiek twarzy Problem Dokładnie Jestem obliczu problemu o nazwie „Lista View Wyświetlacz ostatnią pozycję Dane z tablicy ... "

Problem jest generowany z mapa mieszania

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

wypróbować ten jeden, jeśli jakiekolwiek wątpliwości Utworzony w głowie Wtedy Ask Me Cokolwiek Pytanie Ponownie Musisz po prostu Deklarowana Twój Hash Mapa wnętrzu pętli FOR ...

Korzystanie Hash Mapa Inside Your For For Loop Variable 'b' Stworzony Każdy & Za każdym razem uważany za inny obiekt. A następnie lista prostych tablic wyświetla inny obiekt mapy skrótu.

Używasz tego samego obiektu do przechowywania wartości Hash mapą i że Zastąp zmienną o takiej samej nazwie Dlatego stoją Problem Dziękuję ...

Powiązane problemy