2012-07-26 3 views
11

Natknąłem się na problem, którego nie mogę w pełni zrozumieć, więc miałem nadzieję, że ktoś tutaj miał ten sam problem lub znał dobry sposób rozwiązania problemu .Użyj adaptera tablicowego z większą liczbą wyświetleń w wierszu w widoku listy

Utworzono widok zawierający ListView. Ten ListView zawiera dwa TextView. Problem polega na tym, że nie wiem, gdzie wysyłam wartości, które mają przejść w drugim widoku tekstowym za pomocą ArrayAdapter. Czy istnieje sposób wysyłania z większą ilością informacji do ArrayAdapter, dzięki czemu mogę wysyłać "todaysmenu" TextView?

Sposób ArrayAdapter:

private void createList() { 
    ListView lv = (ListView) findViewById(R.id.mylist); 
    String[] values = new String[] { "Android", "Linux", "OSX", 
      "WebOS", "Windows7", "Ubuntu", "OS/2" 
    }; 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.rowlayout, R.id.restaurantname, values); 
    lv.setAdapter(adapter); 
} 

Znaczniki rząd:

<?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="wrap_content" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/restaurantname" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@+id/restaurantname" 
     android:textSize="23dp" > 

    </TextView> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="@+id/todaysmenu" /> 

</LinearLayout> 

Układ działalność:

<?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="fill_parent" 
    android:orientation="vertical" > 

    <ListView 
    android:id="@+id/mylist" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 
    </ListView> 


</LinearLayout> 

Na początku dostałem wszystko działa, ale kiedy dodałam pojawiają się drugie problemy z tekstem. Wcześniej dziękuję za pomoc!

Odpowiedz

21

Aby to osiągnąć, należy zbudować niestandardowy adapter i nadmuchać niestandardowy układ wierszy. Korzystanie ArrayAdapter nie zadziała, ponieważ

Domyślnie ta klasa spodziewa się, że przewidziane odniesienia id zasobu pojedynczy TextView. Jeśli chcesz użyć bardziej złożonego układu, użyj konstruktorów, które również pobierają identyfikator pola. Ten identyfikator pola powinien odwoływać się do TextView w większym zasobie układu.

Tak, niestandardowe klasy adapter może być somthing jak:

public class CustomAdapter extends ArrayAdapter { 
    private final Activity activity; 
    private final List list; 

    public CustomAdapter(Activity activity, ArrayList<Restaurants> list) { 
     this.activity = activity; 
     this.list = list; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View rowView = convertView; 
     ViewHolder view; 

     if(rowView == null) 
     { 
      // Get a new instance of the row layout view 
      LayoutInflater inflater = activity.getLayoutInflater(); 
      rowView = inflater.inflate(R.layout.rowlayout, null); 

      // Hold the view objects in an object, that way the don't need to be "re- finded" 
      view = new ViewHolder(); 
      view.retaurant_name= (TextView) rowView.findViewById(R.id.restaurantname); 
      view.restaurant_address= (TextView) rowView.findViewById(R.id.textView1); 

      rowView.setTag(view); 
     } else { 
      view = (ViewHolder) rowView.getTag(); 
     } 

     /** Set data to your Views. */ 
     Restaurants item = list.get(position); 
     view.retaurant_name.setText(item.getTickerSymbol()); 
     view.restaurant_address.setText(item.getQuote().toString()); 

     return rowView; 
    } 

    protected static class ViewHolder{ 
     protected TextView retaurant_name; 
     protected TextView restaurant_address; 
    } 
} 

A twój Restaurant.java klasa mogła tak proste, jak opiszę poniżej:

public class Restaurants { 
    private String name; 
    private String address; 

    public Restaurants(String name, String address) { 
     this.name = name; 
     this.address = address; 
    } 
    public void setName(String name) { 
     this.name= name; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setAddress(String address) { 
     this.address= address; 
    } 
    public String getAddress() { 
     return address; 
    } 
} 

Teraz, w ty główna działalność po prostu wiążę listę z pewnymi danymi, np.;

/** Declare and initialize list of Restaurants. */ 
ArrayList<Restaurants> list = new ArrayList<Restaurants>(); 

/** Add some restaurants to the list. */ 
list.add(new Restaurant("name1", "address1")); 
list.add(new Restaurant("name2", "address2")); 
list.add(new Restaurant("name3", "address3")); 
list.add(new Restaurant("name4", "address4")); 
list.add(new Restaurant("name5", "address5")); 
list.add(new Restaurant("name6", "address6")); 

W tym momencie jesteś w stanie ustawić adapter niestandardowy do listy

ListView lv = (ListView) findViewById(R.id.mylist); 

CustomAdapter adapter = new CustomAdapter(YourMainActivityName.this, list); 
lv.setAdapter(adapter); 

To wszystko i powinno działać nicelly, ale gorąco polecam do google dla niektórych lepszych alternatyw dla implementuj inne Adapters.

+0

Dziękuję. To pomogło! Dziękuję Ci. – olovholm

0

myślę, że problem jest tutaj:

Zamiast tego:

<?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="wrap_content" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/restaurantname" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@+id/restaurantname" 
     android:textSize="23dp" > 

    </TextView> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="@+id/todaysmenu" /> 

</LinearLayout> 

Spróbuj czegoś takiego:

<?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="wrap_content" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/restaurantname" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="test text" 
     android:textSize="23dp" > 

    </TextView> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="test text" /> 

</LinearLayout> 

Jeśli to działa, a następnie umieścić swój tekst w katalogu/Folder res/val/string tak:

<string name="testText">Put your text here...</string> 

a następnie wywołać tak:

<?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="wrap_content" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/restaurantname" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/testText" 
     android:textSize="23dp" > 

    </TextView> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/testText" /> 

</LinearLayout> 

Będziesz wtedy ustawić dynamiczne wartości tak:

TextView tv = (TextView)findViewById(R.id.restaurantname); 
tv.setText(values); 
+0

Dzięki za Twoją sugestię, ale w końcu skorzystałem z ArrayAdapter. Zmienia się sposób zmiany wartości tekstowych. Dzięki. – olovholm

0

musiałem rozwiązać ten sam problem i próbował użyć arrayadapter jak tu odpowiedzi powyżej, ale to nie zadziałało.

Później udało mi się zrobić to z baseadapter - to adapter:

public class BusinessAdapter2 extends BaseAdapter { 
    private final ArrayList<Business> myList; 
    LayoutInflater inflater; 
    Context context; 


    public BusinessAdapter2(Context context, ArrayList<Business> myList) { 
     this.myList = myList; 
     this.context = context; 
     inflater = LayoutInflater.from(this.context); 
    } 
    @Override 
    public int getCount() { 
     return myList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return myList.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView==null) convertView = inflater.inflate(R.layout.business_list_item_2, parent, false); 
     // assign the view we are converting to a local variable 
     View v = convertView; 
     Business b = myList.get(position); 
     if (b != null) { 
      TextView name = (TextView) v.findViewById(R.id.textview_name); 
      TextView address = (TextView) v.findViewById(R.id.textview_address); 
      TextView description = (TextView) v.findViewById(R.id.textview_description); 
      TextView discount = (TextView) v.findViewById(R.id.textview_discount); 

      // check to see if each individual textview is null. 
      // if not, assign some text! 
      if (name != null){ 
       name.setText(b.name); 
      } 
      if (address != null){ 
       address.setText(b.address); 
      } 
      if (description != null){ 
       description.setText(b.description); 
      } 
      if (discount != null){ 
       discount.setText(b.discountRate); 
      } 
     } 

     // the view must be returned to our activity 
     return v; 
    } 
} 

to jest klasa Object użyłem (Biznes):

public class Business { 
    String name,address,description,discountRate; 
    public Business(){} 
    public Business(String name,String address,String description,String discountRate){ 
     this.name=name; 
     this.address=address; 
     this.description=description; 
     this.discountRate=discountRate; 
    } 
} 

i to w jaki sposób wypełnić listview do adaptera:

ArrayList<Business> businesses2=new ArrayList<Business>(Arrays.asList(for_listview_objects)); 
    adapter_objects =new BusinessAdapter2(
      context, // The current context (this activity) 
      businesses2); 

    listView.setAdapter(adapter_objects); 
Powiązane problemy