Java 填充自定义阵列适配器

Java 填充自定义阵列适配器,java,android,oop,Java,Android,Oop,我制作了自己的CustomarrayaAdapter,以显示巴西餐馆的列表。我已经跳过了GetView方法来创建自己的自定义视图 private class MyAdapter extends ArrayAdapter<String> { public MyAdapter(Context context, int resource, int textViewResourceId, String[] strings) {

我制作了自己的CustomarrayaAdapter,以显示巴西餐馆的列表。我已经跳过了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文件中提取一个文本字符串,并将其放入列表项中

如果我想在应用程序中合并生成的额外数据数组,我假设我不在GetView类中生成数组,因为每次生成新行时都会重新创建数组。 我应该将代码放在哪里来生成数组,如何将这些数据调用到上面的GetView代码中?
可以将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;
   }
}

值得指出的是,为了获得更好的性能,应该使用传递到getView方法中的convertView变量

convertView的使用允许您重新使用列表项视图,而不是创建对性能有重大影响的新视图。如果你的应用程序中有一个大数据集或重视性能,那么最好查看

您的代码将更像这样:

...
//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;
}
...

基于@CodeDownZero的回答,我强烈建议您采用该模式,并使用convertview回收您的ListView


您好,当我尝试此解决方案时-我收到一条消息,新的lData无法解析为类型!是,包含MyDataClass lData=new lData;-刚刚编辑过
...
//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;
}
...
...

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