2011-08-15 20 views
8

'un satır düzenini dinamik olarak değiştirin Bir uygulamadaki bir sohbet modülünde çalışıyorum; burada iki katılımcıdan gelen karşı taraftaki iletilerin olmasını istiyorum (diğer kullanıcı sola hizalanmış ve kendi msg'im sağa hizalanmış). Şu anda, satır düzenimi bir statik düzen xml (msg ve avatar sola hizalanmış) ile geçirilir. Görünümü dinamik olarak değiştirmek için bir yol var mı, yoksa UI sistemi için çalışma zamanında almak için alternatif bir satır düzeni iletmenin bir yolu var mı?Bir ListView

cevap

5

Sen ArrayAdapter sınıfının getView() yöntemi içinde (eğer ArrayAdapter kendi tanımlıyorsanız varsayarak) yapabilir.

Böyle bir şey olabilir: Her satır işlemek, böylece

private class YourAdapter extends ArrayAdapter<Message> { 
     private final LayoutInflater mLayoutInflater; 

    YourAdapter(YourListActivity activity) { 
     super(mContext, 0); 
     mLayoutInflater = LayoutInflater.from(activity); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      // Inflate your view 
      convertView = mLayoutInflater.inflate(R.layout.list_view_item, parent, false); 
      mViewHolder = new ViewHolder(); 
      mViewHolder.avatar = (ImageView) convertView.findViewById(R.id.placeholder); 
      mViewHolder.message = (TextView) convertView.findViewById(R.id.message); 

      convertView.setTag(mViewHolder); 
     } else { 
      mViewHolder = (ViewHolder) convertView.getTag(); 
     } 

     final Message message = getItem(position); 

     mViewHolder.message.setText(message.getMessage()); 
     // etc. Manipulate your views as you wish 


     return convertView; 
    } 
} 


    private static class ViewHolder { 
     TextView message; 
     ImageView avatar; 
    } 

getView (Kaydırma yaptığınızda ya da yeni elemanlar buna eklendiğinde gibi) ListView her değiştiğinde denilen alacak orada istediğiniz gibi. ListView dizi bağdaştırıcısını bu sınıfın bir örneğine ayarlamayı unutmayın.

listView.setListAdapter(new mYourAdapter); 
2

bunu yapmak için gösterilmiştir bir yolu (im iyi uygulama ya da değil! Emin değilim) bir XML dosyasında hem görüşlere sahip olmaktır. Çalışma zamanında, her bir görünüm için bir başvuru (findViewById kullanarak) alabilir ve görünmeyen özelliği istemediğiniz bir öğeye ayarlayabilirsiniz.

Açık değilse, bazı örnek kodları bulmaya çalışıyorum?

+0

ah, o başarmak mümkün? Daha önce simplecursoradapter kullanmış olduğum gibi ID'ler dizisi için int [] yerine int [] [] 'i geçtiğim özel bir simplecursoradapter yaptık. – jingyin

5
private LayoutInflater mInflater; 
private static final int TYPE_ITEM1 = 0; 
private static final int TYPE_ITEM2 = 1; 
ArrayList<String> s= new ArrayList<String>(); 
int time; 
String names[]={"raghu","pavan","rakesh","raghu","pavan"}; 
Context c; 

@Override 
public int getItemViewType(int position) { 
    if((position%2)==0) 
    { 
     return 0; 
    } 
    return 1;  
} 

@Override 
public int getViewTypeCount() { 
    return 2; 
} 

public Customlistadapter(CustomListView customListView, int time) { 
    // TODO Auto-generated constructor stub 
    for(int i=0;i<=10;i++) 
    { 
     s.add("Raghu"); 
    } 
    this.mInflater = LayoutInflater.from(customListView); 
    c=customListView; 
    this.time=time; 
} 
public int getCount() { 
    return s.size(); 
} 

public Object getItem(int arg0) { 
    return s.get(arg0); 
} 

public long getItemId(int arg0) { 
return 0; 
} 

@Override 
public void notifyDataSetChanged() { 
    super.notifyDataSetChanged(); 
    if(CustomListView.chk==true) 
    { 
    s.add("Raghu"); 
    } 
    else if(CustomListView.chk==false) 
    { 
    s.remove(s.size()-1); 
    }  
} 
@Override 
public void notifyDataSetInvalidated() { 
    super.notifyDataSetInvalidated(); 
} 
public View getView(final int arg0, View arg1, ViewGroup arg2) { 
    ViewHolder vh; 
    vh= new ViewHolder(); 
    int type = getItemViewType(arg0); 
    System.out.println("getView " + arg0 + " type = "+type); 
    if(arg1==null) 
    { 
     switch (type) { 
     case TYPE_ITEM1: 
      arg1=mInflater.inflate(R.layout.listview, arg2,false);    
      vh.tv= (TextView)arg1.findViewById(R.id.textView1); 
      vh.tv1= (TextView)arg1.findViewById(R.id.textView2); 
      vh.tv2=(TextView)arg1.findViewById(R.id.textView3); 
      vh.tv.setText(s.get(arg0)); 
      vh.tv1.setText(s.get(arg0)); 
      vh.tv2.setText(Integer.toString(time)); 
      break; 
     case TYPE_ITEM2: 
      arg1=mInflater.inflate(R.layout.listviewimg, arg2,false); 
      vh= new ViewHolder(); 
      vh.iv1= (ImageView)arg1.findViewById(R.id.iv1); 
      vh.iv2= (ImageView)arg1.findViewById(R.id.iv2); 
      vh.iv1.setBackgroundResource(R.drawable.ic_launcher); 
      vh.iv2.setBackgroundResource(R.drawable.ic_launcher); 
      break; 
    } 
     arg1.setTag(vh); 
    } 
    else 
    { 
     vh= (ViewHolder) arg1.getTag(); 
    } 
    return arg1; 
} 

1.Komom Adaptör sınıfınız, temel Adaptörünü genişletir. 2. geçersiz kıl getItemViewType() ve getViewTypeCount() 3. GetView içinde tipine göre bir görünümü() şişirin

0

Kodum:

private void setAlignment(ViewHolder holder, boolean isOutgoing, QBChatMessage chatMessage) { 

    if (!isOutgoing) { 
     LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) holder.contentWithBG.getLayoutParams(); 
     layoutParams.gravity = Gravity.LEFT; 
     holder.contentWithBG.setLayoutParams(layoutParams); 

     RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) holder.content.getLayoutParams(); 
     lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT, 0); 
     lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
     holder.content.setLayoutParams(lp); 

     layoutParams = (LinearLayout.LayoutParams) holder.txtInfo.getLayoutParams(); 
     layoutParams.gravity = Gravity.RIGHT; 
     holder.txtInfo.setLayoutParams(layoutParams); 

     if (holder.txtMessage != null) { 
      holder.contentWithBG.setBackgroundResource(R.drawable.bubblevioletcopy); 
      layoutParams = (LinearLayout.LayoutParams) holder.txtMessage.getLayoutParams(); 
      layoutParams.gravity = Gravity.RIGHT; 
      holder.txtMessage.setLayoutParams(layoutParams); 
      holder.lnr_image.setLayoutParams(layoutParams); 
     } else { 
      holder.contentWithBG.setBackgroundResource(android.R.color.transparent); 
     } 
    } else { 
     LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) holder.contentWithBG.getLayoutParams(); 
     layoutParams.gravity = Gravity.LEFT; 
     holder.contentWithBG.setLayoutParams(layoutParams); 

     RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) holder.content.getLayoutParams(); 
     lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 0); 
     lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
     holder.content.setLayoutParams(lp); 

     layoutParams = (LinearLayout.LayoutParams) holder.txtInfo.getLayoutParams(); 
     layoutParams.gravity = Gravity.RIGHT; 
     holder.txtInfo.setLayoutParams(layoutParams); 

     if (holder.txtMessage != null) { 
      holder.contentWithBG.setBackgroundResource(R.drawable.bubblegraycopy); 
      layoutParams = (LinearLayout.LayoutParams) holder.txtMessage.getLayoutParams(); 
      layoutParams.gravity = Gravity.RIGHT; 
      holder.txtMessage.setLayoutParams(layoutParams); 
     } else { 
      holder.contentWithBG.setBackgroundResource(android.R.color.transparent); 
     } 
    } 
} 
+0

Sadece sohbet modülünde –

+0

Lütfen kodunuza ek olarak bir açıklama yapın. – Jan

+0

Farklı bir düzen veya mesaj gönderdiğimde veya başka bir kişiyi mesaj gönderdiğimde ve farklı bir tasarım görüntülediğimde, sohbet modülünde çalışıyorum. –