2012-01-01 98 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; 
}