Вопрос по android-widget, android – Как установить обе строки ListView, используя simple_list_item_2?

33

Таким образом, следующее создаст ListView, в котором строки имеют свои & quot; первичные & quot; textview заполнено массивом значений.

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
    android.R.layout.simple_list_item_2, android.R.id.text1, values);

Изменение третьего параметра на android.R.id.text2 устанавливает «вторичный» TextView. Есть ли простой способ установить оба?

Ваш Ответ

4   ответа
2

adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_2,va,lues){
            @Override
            public View getView(int position, View convertView, ViewGroup parent){

               TwoLineListItem   row = (TwoLineListItem)super.getView(position, convertView, parent);

                row.getText1().setText(values.get***());
                row.getText2().setText(values.get****());

                return row;
            }
        };
    setAdapter(adapter);
@JasonRobinson Очевидно, нет. Он даже не прошел эти параметры.
Это неправильно - вы не используетеconvertView или жеparent...
@Timmmm Верно, но, видя, что нетgetView() метод вArrayAdapter без параметров, намерение было четко назвать суперgetView метод со всеми параметрами. Я отредактировал ответ, чтобы устранить неоднозначность.
Это не сработало для меня, но это сработало:sethgholson.com/2012/01/…
@Timmmmsuper.getView() метод заботится об этом.
4

ArrayAdapter<CustomObject> adapter = new ArrayAdapter<CustomObject> (_context, android.R.layout.simple_list_item_2, android.R.id.text1, listCustomObject) {

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

                                    TextView text1 = (TextView) view.findViewById(android.R.id.text1);
                                    TextView text2 = (TextView) view.findViewById(android.R.id.text2);

                                    text1.setText(listCustomObject.get(position).getText1());

                                    text2.setText( listCustomObject.get(position).getText2() );

                                    return view;
                                }

                            };
42

содержащий два TextViews. ArrayAdapter здесь работать не будет, вам придется либо создать собственный адаптер, либо использовать тот, который поддерживает его, например SimpleCursorAdapter.

ListAdapter adapter = new SimpleCursorAdapter(
                 this,
                 android.R.layout.simple_list_item_2,
                 mCursor,     // Pass in the cursor to bind to.
                 new String[] {People.NAME, People.COMPANY}, // Array of cursor columns to bind to.
                 new int[] {android.R.id.text1, android.R.id.text2});  // Parallel array of which template objects to bind to those columns.

         // Bind to our new adapter.
         setListAdapter(adapter);

Or if you dont want SimpleCursorAdapter You will have to create Custom ArrayAdapter or BaseAdapter

Создайте пользовательский ArrayAdapter, примените массив объектов (имеющий два элемента) к пользовательскому адаптеру и передайте его в getListView.setAdapter.

Переопределите метод getView ArrayAdapter, чтобы применить ваши строки имен к TextViews в вашем пользовательском представлении строки списка.

Следующий фрагмент поможет вам.

SampleActivity.java

package org.sample;

import java.util.ArrayList;

import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import android.widget.TwoLineListItem;

public class SampleActivity extends ListActivity {

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        Person person;

        ArrayList<Person> persons = new ArrayList<Person>();

        person = new Person();
        person.setName("Vipul");
        person.setAge(20);
        persons.add(person);

        person = new Person();
        person.setName("Anil");
        person.setAge(22);
        persons.add(person);

        setListAdapter(new MyAdapter(this, persons));
    }

}

Person.java

class Person {
    String name;
    int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

MyAdapter.java

class MyAdapter extends BaseAdapter {

    private Context context;
    private ArrayList<Person> persons;

    public MyAdapter(Context context, ArrayList<Person> persons) {
        this.context = context;
        this.persons = persons;
    }

    @Override
    public int getCount() {
        return persons.size();
    }

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        TwoLineListItem twoLineListItem;

        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            twoLineListItem = (TwoLineListItem) inflater.inflate(
                    android.R.layout.simple_list_item_2, null);
        } else {
            twoLineListItem = (TwoLineListItem) convertView;
        }

        TextView text1 = twoLineListItem.getText1();
        TextView text2 = twoLineListItem.getText2();

        text1.setText(persons.get(position).getName());
        text2.setText("" + persons.get(position).getAge());

        return twoLineListItem;
    }
}
Страница @Fred Android "Советы по повышению производительности" советует разработчикам "избегать ВНУТРЕННИХ методов получения / установки", & quot; с помощью которого они, кажется, ссылаются на методы доступа к переменным-членам. Это не означает, что вы не должны писать свои классы с надлежащими интерфейсами для взаимодействия с остальным миром. И в том же совете они также указывают, что ProGuard включает геттеры и сеттеры, что делает весь смысл спорным.
Вы используете геттеры / сеттеры вPerson.Java это то, что Google советует в своем руководстве по производительности.
Это отличный ответ, дающий как необходимую информацию, так и очень практичные приложения в коде.
100

но я считаю, что данный ответ слишком сложен. Как указано вДругой ответы, желаемый функционал может быть достигнут с помощью ArrayAdapter с очень простым приемом.

Вы можете переопределить метод getView ArrayAdapter:

ArrayAdapter adapter = new ArrayAdapter(context, android.R.layout.simple_list_item_2, android.R.id.text1, list) {
  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    View view = super.getView(position, convertView, parent);
    TextView text1 = (TextView) view.findViewById(android.R.id.text1);
    TextView text2 = (TextView) view.findViewById(android.R.id.text2);

    text1.setText(persons.get(position).getName());
    text2.setText(persons.get(position).getAge());
    return view;
  }
};

Если вы не заметили: хитрость заключается в том, чтобыandroid.R.id.text1 как (в основном ненужный) параметр, в противном случае вызовsuper вызовет исключение.

Кроме того, это решение не используетTwoLineListItem, который был объявлен устаревшим в API 17.

Спасибо @ winne2, это решение только что закончилось 5 днями поиска в интернете.
Замедлит ли это решение большие списки? Это как-то использует переработку?
Да, TwoLineListItem устарел, но не думаю, что он каким-то образом связан с SimpleCursorAdapter только потому, что они использовались вместе в примере Vipul. SimpleCursorAdapter - это очень полезная универсальная реализация ListAdapter, которая выполняет итерацию по строкам курсора, сопоставляя данные столбцы с данными представлениями макета. Как правило, это предпочтительнее, чем написание собственного ListAdapter при заполнении ListView из курсора. Хотя, даже если вы не используете Cursor, не исключено использование SimpleCursorAdapter и перенос данных в MatrixCursor.
Спасибо, это сработало!list переменная передается вArrayAdapter хотя на самом деле никогда не используется.
Вы правы, TwoLineListItem не связан с SimpleCursorAdapter. Я включил замечание просто потому, что TwoLineListItem используется в двух других ответах. Мое решение только для простых, коротких списков. Более продвинутые решения будут, например, используйте шаблон ViewHolder тоже.

Похожие вопросы