Заполнение пользовательских ArrayAdapters - PullRequest
0 голосов
/ 01 января 2012

Я создал собственный CustomArrayAdapter для отображения списка бразильских ресторанов. Я переопределил метод GetView, чтобы создать свой собственный вид.

private class MyAdapter extends ArrayAdapter<String> {

        public MyAdapter(Context context, int resource, int textViewResourceId,
                String[] strings) {
            super(context, resource, textViewResourceId, strings);
            // TODO Auto-generated constructor stub
        }

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

     LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     View row = inflater.inflate(R.layout.list_item, parent,false);
     String [] items= getResources().getStringArray(R.array.locations_array);
     TextView tv= (TextView) row.findViewById(R.id.textView1);
     ImageView iv = (ImageView) row.findViewById(R.id.imageView1);
     tv.setText(items[position]);
     iv.setImageResource(R.drawable.brazil);
            return row;
        }
    }

В настоящее время этот новый класс GetView извлекает текстовую строку из XML-файла ресурса и помещает ее в элемент списка.

  1. Если я хотел включить массив дополнительных данных, сгенерированных в приложении, я предполагаю, что я не делаю генерацию массива в классе GetView, так как он будет воссоздан каждый раз, когда создается новая строка.
  2. Куда мне поместить код для создания массива и как я вызываю эти данные в приведенном выше коде GetView?

Ответы [ 3 ]

1 голос
/ 01 января 2012

Стоит отметить, что для повышения производительности следует использовать переменную convertView, переданную в метод getView().

Использование convertView позволяет повторно использовать представления элементов списка вместо создания новых, что сильно сказывается на производительности. Если у вас большой набор данных или вы оцените производительность в своем приложении, вам стоит проверить документацию для getView()

Ваш код будет выглядеть примерно так:

...
//it's also worth moving these methods to your constructor so they aren't called every time getView() for better performance
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
String [] items= getResources().getStringArray(R.array.locations_array);

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if(convertView == null)
        convertView = inflater.inflate(R.layout.list_item, parent, false);
    TextView tv= (TextView) convertView.findViewById(R.id.textView1);
    ImageView iv = (ImageView) convertView.findViewById(R.id.imageView1);
    tv.setText(items[position]);
    iv.setImageResource(R.drawable.brazil);
    return row;
}
...
1 голос
/ 01 января 2012

Опираясь на ответ @ CodeDownZero, я очень рекомендую вам принять шаблон ViewHolder и определенно перезапустить списки (используя convertview).

...

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

    LayoutInflater inflater = (LayoutInflater) getSystemService
      (Context.LAYOUT_INFLATER_SERVICE);
    view = inflater.inflate(textViewResourceId, parent, false);
    final ViewHolder viewHolder = new ViewHolder();
    viewHolder.tv1 = (TextView) view.findViewById(R.id.textView1);
    viewHolder.tv2 = (TextView) view.findViewById(R.id.textView2);
    view.setTag(viewHolder);

  } else {
    view = convertView;
  }

  ViewHolder holder = (ViewHolder) view.getTag();

  MyDataClass data = this.getItem(position);
  holder.tv1.setText(data.street);
  holder.tv2.setText(data.name);
  return view;
}

...

private class ViewHolder {
  private TextView tv1;
  private TextView tv2;
}
0 голосов
/ 01 января 2012

ArrayAdapter может быть основан на пользовательском классе вместо строки.Вот пример:

public class MyDataClass {
  public String street;
  public String name;
}
private class MyAdapter extends ArrayAdapter<MyDataClass> {
        @Override
  public View getView(int position, View convertView, ViewGroup parent) {

     LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     View row = inflater.inflate(R.layout.list_item, parent,false);
     TextView tv1= (TextView) row.findViewById(R.id.textView1);
     TextView tv2= (TextView) row.findViewById(R.id.textView2);
     MyDataClass data = this.getItem(position);
     tv1.setText(data.street);
     tv2.setText(data.name);
     return row;
   }
}

Чтобы заполнить адаптер данными, вы можете использовать этот фрагмент в методе OnCreate в Activity:

  ..
  MyAdapter adapter = new MyAdapter();
  MyDataClass lData = new MyDataClass();  // here was a mistake
  lData.name = "MyName";
  lData.street = "MyRoad";
  adapter.Add(lData);
  ..
  ListView.Adapter=adapter; // where Listview is the Listview
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...