Intereting Posts
Завершено с не нулевым значением выхода 3 Панель инструментов с иммерсивным полноэкранным режимом Как установить контент в линейном макете на BOTTOM экрана в Android.? Пакет обеспечения совместимости Android не включает Activity.getFragmentManager () Галерея изображений с использованием ViewPager + масштабирование в ImageViews Как создать несколько приложений для Android с одной базы кода Несъемное уведомление Лучший способ реализации прокручивающего навигационного ящика Пример использования андроидов lrucache Как вы делаете изображения с высоким разрешением, используя Camera.takePicture ()? GSON выбрасывает «Ожидаемый BEGIN_OBJECT, но был BEGIN_ARRAY»? Обходной путь для операций с файлами Nitex для SQL-файлов Nexus 9 на внешних серверах? Построить ошибки с зависимостью XML с java-объектом в build.gradle для модификации Как создать spinner в Android Дооснащение getBodyAs () не позволяет проанализировать ошибку сервера

Как установить адаптер в случае нескольких текстовых просмотров для списка?

У меня есть несколько TextView каждого элемента списка в моем ListView . Я научился писать правильный метод getView я верю, но я не уверен, что я использую setAdapter для вызова этого метода.

 private static String[] project = {"proj1","proj2"}; private static String[] workRequests = {"requirement gathering", "design"}; private static String[] startDate = {"02/21/2012","07/15/2011"}; private static String[] status = {"WIP","DONE"}; ListView mListView; public class MyDashboardActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mydashboard); final LayoutInflater mInflater = LayoutInflater.from(this); mListView = (ListView)findViewById(R.id.dashboardList); mListView.setAdapter( // How do I set the adapter? ); } public View getView(int position, View convertView, ViewGroup parent) { System.out.println("enters"); if(convertView == null){ convertView = LayoutInflater.from(this).inflate(R.layout.mydashboard,null); } ((TextView) convertView.findViewById(R.id.project)).setText(project[position]); ((TextView) convertView.findViewById(R.id.work_request)).setText(workRequests[position]); ((TextView) convertView.findViewById(R.id.start_date)).setText(startDate[position]); ((TextView) convertView.findViewById(R.id.status)).setText(status[position]); return convertView; } 

Это xml-макет:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/home_root" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <!-- Include Action Bar --> <include layout="@layout/actionbar_layout" /> <ListView android:id="@+id/dashboardList" style="@style/LeftHeaderText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:background="@drawable/innerdashboard_bg" android:textColor="@color/textColor" > <TextView android:id="@+id/project" /> <TextView android:id="@+id/work_request" /> <TextView android:id="@+id/start_date" /> <TextView android:id="@+id/status" /> </ListView> </LinearLayout> 

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

Solutions Collecting From Web of "Как установить адаптер в случае нескольких текстовых просмотров для списка?"

Вам необходимо реализовать свой собственный адаптер. Мой способ – также определить объект, который «представляет» представление.

Ниже приведен простой пример с двумя TextViews которые соответствуют вашим потребностям.

Объект, представляющий представление (строка в ListView):

 public class CustomObject { private String prop1; private String prop2; public CustomObject(String prop1, String prop2) { this.prop1 = prop1; this.prop2 = prop2; } public String getProp1() { return prop1; } public String getProp2() { return prop2; } } 

Затем пользовательский адаптер:

 public class CustomAdapter extends BaseAdapter { private LayoutInflater inflater; private ArrayList<CustomObject> objects; private class ViewHolder { TextView textView1; TextView textView2; } public CustomAdapter(Context context, ArrayList<CustomObject> objects) { inflater = LayoutInflater.from(context); this.objects = objects; } public int getCount() { return objects.size(); } public CustomObject getItem(int position) { return objects.get(position); } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if(convertView == null) { holder = new ViewHolder(); convertView = inflater.inflate(R.layout.your_view_layout, null); holder.textView1 = (TextView) convertView.findViewById(R.id.id_textView1); holder.textView2 = (TextView) convertView.findViewById(R.id.list_id_textView2); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.textView1.setText(objects.get(position).getprop1()); holder.textView2.setText(objects.get(position).getprop2()); return convertView; } } 

Теперь вы можете определить и установить свой адаптер в своей деятельности:

 ArrayList<CustomObject> objects = new ArrayList<CustomObject>(); CustomAdapter customAdapter = new CustomAdapter(this, objects); listView.setAdapter(customAdapter); 

Теперь вам нужно только управлять своим CustomObject в списке объектов. Не забудьте вызывать customAdapter.notifyDataSetChanged() если вы хотите повторно использовать изменения в ListView.

Ваш код getView () должен перейти в класс, который расширяет BaseAdapter или один из его подклассов.

Один из способов сделать это – создать частный класс в MyDashboardActivity. Ниже приведен краткий пример (потребуется дополнительный код). Вы, вероятно, также захотите, чтобы пользовательский объект связывал все вещи, которые вы хотите отобразить в одном элементе списка. Вместо нескольких массивов, есть один массив настраиваемого типа, который имеет свойства для каждого значения, которое вы отслеживаете.

Еще одна вещь: ваши четыре TextViews должны войти в свой собственный файл макета (см. Здесь list_item.xml). Этот файл макета файла подключается через конструктор пользовательского адаптера (я добавил комментарий в код ниже, чтобы выделить это).

 protected CustomAdapter mAdapter; public class MyDashboardActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mydashboard); final LayoutInflater mInflater = LayoutInflater.from(this); mListView = (ListView)findViewById(R.id.dashboardList); mAdapter = new CustomAdapter(this, <array to be adapted>); mListView.setAdapter(mAdapter); } private class CustomAdapter extends ArrayAdapter<String> { protected Context mContext; protected ArrayList<String> mItems; public CustomAdapter(Context context, ArrayList<String> items) { super(context, R.layout.custom_list_item, items); // Use a custom layout file mContext = context; mItems = items; } public View getView(int position, View convertView, ViewGroup parent) { System.out.println("enters"); if(convertView == null){ convertView = LayoutInflater.from(this).inflate(R.layout.mydashboard,null); } // You'll need to use the mItems array to populate these... ((TextView) convertView.findViewById(R.id.project)).setText(project[position]); ((TextView) convertView.findViewById(R.id.work_request)).setText(workRequests[position]); ((TextView) convertView.findViewById(R.id.start_date)).setText(startDate[position]); ((TextView) convertView.findViewById(R.id.status)).setText(status[position]); return convertView; } } } 

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

listset.xml

 <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/shipMenu" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> 

Listitems.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="fill_parent" android:orientation="horizontal"> <TextView android:id="@+id/makerID" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:textSize="25dp"/> </LinearLayout> 

С приведенным выше я пока не занимаюсь показом, но я намерен добавить ImageView для значков (и вы также можете добавить TextViews). Вот мой пользовательский класс адаптера.

ListAdapter.java

 class ListAdapter extends ArrayAdapter <String> { public ListAdapter(Context context, String[] values) { super(context, R.layout.listitems, values); //set the layout that contains your views (not the one with the ListView) } @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = LayoutInflater.from(getContext()); View view = inflater.inflate(R.layout.listitems, parent, false); //same here. String text = getItem(position); TextView makerID = (TextView) view.findViewById(R.id.makerID); makerID.setText(text); return view; } } 

В вашем основном файле активности

 setContentView (R.layout.listset); 

И добавьте это под теми же скобками, что и setContentView ()

 ListAdapter adapter = new ListAdapter(this, MyString[]); //place your String array in place of MyString ListView lv = (ListView) findViewById(R.id.ListViewID); //the ID you set your ListView to. lv.setAdapter(adapter); 

редактировать

Я немного опаздываю на вечеринку, похоже, но, возможно, это поможет кому-то.