Используйте адаптер массива с большим количеством просмотров в строке в списке

Я наткнулся на проблему, с которой я не могу оторваться, поэтому я надеялся, что, возможно, у кого-то была такая же проблема или был хороший способ решить проблему.

Я создал представление, содержащее ListView. Этот ListView содержит два TextView. Проблема в том, что я не знаю, куда я отправляю значения, которые предназначены для перехода во второе текстовое представление с помощью ArrayAdapter. Есть ли способ отправить дополнительную информацию в ArrayAdapter, чтобы я мог кормить «todaysmenu» TextView?

Метод 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); } 

Разметка строки:

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

Макет деятельности:

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

В начале я получил все, чтобы работать, но когда я добавил, что возникают проблемы со вторым текстовым полем. Заранее благодарю вас за помощь!

Для этого вам нужно создать пользовательский адаптер и раздуть свой собственный макет строки. Использование ArrayAdapter не будет работать, потому что

По умолчанию этот класс ожидает, что предоставленный идентификатор ресурса ссылается на один TextView. Если вы хотите использовать более сложный макет, используйте конструкторы, которые также принимают идентификатор поля. Этот идентификатор поля должен ссылаться на TextView в более крупном ресурсе макета.

Таким образом, ваш пользовательский класс адаптера может быть примерно таким:

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

И ваш класс Restaurant.java может быть простым, как я описал ниже:

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

Теперь в вашей основной деятельности просто привяжите список к некоторым данным, например;

 /** 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")); 

На этом этапе вы можете настроить пользовательский адаптер в свой список

 ListView lv = (ListView) findViewById(R.id.mylist); CustomAdapter adapter = new CustomAdapter(YourMainActivityName.this, list); lv.setAdapter(adapter); 

Это все, и он должен работать отлично, но я настоятельно рекомендую вам google для некоторых лучших альтернатив для реализации других адаптеров .

Вы можете попробовать этот https://devtut.wordpress.com/2011/06/09/custom-arrayadapter-for-a-listview-android/ . Вы должны создать пользовательский элемент класса с необходимыми полями и расширить ArrayAdapter .

Я думаю, что ваша проблема здесь:

Вместо этого:

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

Попробуйте что-то вроде этого:

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

Если это сработает, разместите текст в папке / res / val / string следующим образом:

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

И затем вызывайте так:

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

Затем вы должны установить динамические значения следующим образом:

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

Я должен был решить ту же проблему и попытался использовать arrayadapter, как здесь сказано выше, но это не сработало.

Позже мне удалось сделать это с помощью baseadapter – это адаптер:

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

Это класс объекта, который я использовал (Бизнес):

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

И вот как я заполняю список в адаптер:

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