填充自定义ArrayAdapter

时间:2012-01-01 18:15:43

标签: java android oop

我制作了自己的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 个答案:

答案 0 :(得分:1)

值得指出的是,为了获得更好的性能,您应该使用传递给convertView方法的getView()变量。

convertView的使用允许您重复使用列表项视图,而不是创建具有重大性能影响的新视图。如果您的应用中有大量数据集或值效果,那么最好查看documentation for 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 :(得分:1)

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

答案 2 :(得分:0)

您可以将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方法中使用此代码段:

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