2011-04-04 20 views
8

Satırlar için birçok farklı düzen içeren bir ListAdapter var. Temiz bir koda sahip olmak için Görünüm sınıflarındaki bağdaştırıcının getView() satırlarının düzenini dış kaynak olarak kullanmak istiyorum. XML düzenini özel görünüme şişirmek mümkün mü? LayoutInflater'ı yalnızca buldum, ancak bir Görünüm döndürdü ve bu yardımcı olmuyor. Bir Faaliyetin setLayout() gibi bir şeye sahip olmak istiyorum. Mümkün mü?Android'de XML Düzeni ile Özel Görünüm

Teşekkürler! Özel bir satır görünüme sahip ve onun kurucu sizin xml açıldığı olabilir

+0

Size ulaşılamadı. Daha iyi bir şekilde açıklayabilir misin? –

+0

Eğer Matthew Willis cevabını beğenirseniz, sorumu anlayabilirsiniz. – dbrettschneider

cevap

28

public class CalendarAdapter extends BaseAdapter { 
protected static CalViewHolder holder; 
private LayoutInflater mInflater; 
public HashMap<Integer,String[]> appointments = new HashMap<Integer,String[]>(); 

public CalendarAdapter(Context context,HashMap<Integer,String[]> set_appointments) { 
    // Cache the LayoutInf 
    mInflater = LayoutInflater.from(context); 
    appointments = set_appointments; 
} 
@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return appointments == null ? 0:appointments.size(); 
} 
@Override 
public Object getItem(int arg0) { 
    // TODO Auto-generated method stub 
    return null; 
} 
@Override 
public long getItemId(int arg0) { 
    // TODO Auto-generated method stub 
    return 0; 
} 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.xml.appointment, null); 
     holder = new CalViewHolder(); 
     holder.app_lay = (LinearLayout) convertView.findViewById(R.id.appointment_layout); 
     holder.app_head = (TextView) convertView.findViewById(R.id.appointment_head); 
     holder.app_body = (TextView) convertView.findViewById(R.id.appointment_body); 
     convertView.setTag(holder); 
    }else{ 
     holder = (CalViewHolder) convertView.getTag(); 
    } 
    holder.app_head.setText(appointments.get(position)[0]); 
    holder.app_body.setText(appointments.get(position)[1]); 
    return convertView; 
} 

static class CalViewHolder { 
    LinearLayout app_lay; 
    TextView app_head; 
    TextView app_body; 
} 

}:

public MyRow extends LinearLayout { 
    public MyRow(Context context) { 
     super(context); 
     LayoutInflater.from(context).inflate(R.layout.my_row, this, true); 
      ... other initialization ... 
    } 
} 

ve

+0

Teşekkürler, bu benim problemimi çözüyor! – dbrettschneider

+0

Bunu denedim ve hata aldım 'birleştirme yalnızca geçerli bir görünüm grubu kök ve attachtoroot = true' ile kullanılabilir. Neden? Aynı çağrıyı kullanıyorum, öznitelik içermeyen bir kök olarak birleştirme ile xml kullanıyorum. –

+1

Bu link bir 404 şimdi. bulabildiğim en yakın http://developer.android.com/training/improving-layouts/reusing-layouts.html idi, ancak http://android-developers.blogspot.ca/2009/03/ android-düzen-hileler-3-optimize-by.html – Chani

0

Ben alwas gibi viewholder ile özel bir Adaptörü kullanın daha sonra :

<?xml version="1.0" encoding="utf-8"?> 
<merge xmlns:android="http://schemas.android.com/apk/res/android"> 
    ... your row layout ... 
</merge> 
adresinden merge kullanın.

merge öğesi, çocuklarının özel görünümünüzün alt öğesi olarak eklenmesini sağlar. Daha fazla bilgi için Merging Layouts göz atın.

+0

Ben de bu yöntemi kullanıyorum, ama satır için birçok farklı düzen var, bu yüzden gerçekten büyük bir "eğer" var. Birçok farklı düzen ile – dbrettschneider

+0

, performans yavaşlayacak, ben altı farklı tutucu ile benzer bir Listview fark, bu kabul edilebilir, ancak kontrol ekleyebilir veya çıkarırsanız, her bir öğeyi yeniden yüklemeniz gerektiğini unutmayın. Belki bir liste görünümü gerçekten ihtiyacınız olan şey değildir, görüşlerinizi sadece bir LinearLayout'a eklemeyi düşünün. – 2red13