'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
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);
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?
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
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);
}
}
}
Sadece sohbet modülünde –
Lütfen kodunuza ek olarak bir açıklama yapın. – Jan
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. –
- 1. ListView
- 2. ListView
- 3. ListView
- 4. ListView
- 5. , ListView
- 6. ListView.
- 7. Öğeleri bir WPF ListView
- 8. ListViewItem bir ListView
- 9. Bir öğenin öğesinin ListView
- 10. Listview hatası: "İçeriğinizin id özniteliği" android.R.id.list "olan bir ListView olmalıdır"
- 11. Android ListView, ben özel adaptör ile bir ListView kullanıyorum
- 12. ListView öğesinin odağını devre dışı bırakma ListView
- 13. ListViewItem'den bir ListView nasıl edinilir?
- 14. ListView öğesinin bir öğesini değiştirme
- 15. Android döngü sonsuz bir ListView?
- 16. ListView adaptör veri değişikliği bildirilmeksizin ListView olmaksızın
- 17. Genişletilebilir ListView
- 18. güncelleme listview
- 19. ListView öğeleri,
- 20. StartActivityForResult ListView
- 21. ListView öğeleri
- 22. Android ListView
- 23. ListView düzgün
- 24. ListView görüntülenemiyor
- 25. Bir atlayışın son konumunu bir ListView
- 26. ListView, bir seferde yalnızca bir değeri tutar
- 27. Android ListView bir OnClickListener Ben, bu XML özel XML ListItems ile doldurulan bir ListView olduğunu var
- 28. Android ListView ListView yüksekliğini hareket ettirmeden içerik için dolgu oluşturun.
- 29. ListView ItemTemplate içinde bir ızgara oluşturma
- 30. Ben bu kod parçası bir ListView
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