2012-01-01 74 views
-1

我已经让自己的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代码中?

回答

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 
+0

嗨,当我尝试这种解决方案 - 我得到一个消息,新的lData不能解析为类型! – 2012-01-02 02:32:30

+0

是的,在包含MyDataClass的行中有一个错误lData = new lData(); - 只是编辑它 – CodeDownZero 2012-01-02 02:51:35

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

大厦@ 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; 
} 
相关问题