Как установить адаптер в случае нескольких textviews на listview?
у меня есть несколько TextView
s на элемент списка в my ListView
. Я научился правильно писать!--4--> метод я верю, но я не уверен, что я использую 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>
Я пробовал несколько способов, ни один из которых не работал. Может ли кто-нибудь предложить, как установить адаптер в этом случае? Спасибо!
3 ответов
вам нужно реализовать свой собственный адаптер. Мой способ - также определить объект, который" представляет " представление.
Ниже приведен очень простой пример с двумя 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()
когда вы хотите repercute изменения в 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>
элементов listitem.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);
редактировать
Я немного опоздал на вечеринку похоже, но может это поможет кому-то.