2011-08-15 26 views
8

私は2人の参加者からのメッセージを反対のアライメント(他のユーザーは左揃え、自分のmsgは右寄せ)にしたいアプリでチャットモジュールを作成しています。今、私の行レイアウトは静的レイアウトxml(msgとアバターを左揃えにして)で渡されます。ビューを動的に変更する方法はありますか、実行時に選択するUIシステムの代替行レイアウトを渡す方法はありますか?リストビューの行レイアウトを動的に変更

答えて

5

ArrayAdapterクラスのgetView()メソッド内で行うことができます(独自のArrayAdapterを定義していると仮定します)。

あなたはこのような何かを持っていることができます:あなたはそれぞれの行を操作することができますので、

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は(あなたがスクロールするとき、または新しい要素がそれに追加されたときのように)あなたはListViewが変更されるたびに呼び出されますあなたが望む通りに ListViewの配列アダプタをこのクラスのインスタンスに設定することを忘れないでください。

listView.setListAdapter(new mYourAdapter); 
2

1つのXMLファイルに両方のビューを表示する方法です(これはベストプラクティスかどうかはわかりません)。実行時には、(findViewByIdを使用して)各ビューへの参照を取得し、可視プロパティを不要なものに設定することができます。

どうすればよいでしょうか?

+0

ああ、それはなんとかですか?私は以前simplecursoradapterを使っていたので、ビューIDの配列のint [] []の代わりにint [] []を渡したカスタムsimplecursoradapterをやってしまった。 – 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.カスタムアダプタクラスはベースアダプタを拡張します。 2.オーバーライドgetItemViewType()とgetViewTypeCount() 3.(getViewメソッドに種類に応じて、ビューを膨らま)

0

マイコード:

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

チャットモジュールのみ –

+0

あなたのコードにいくつかの説明を加えてください。 – Jan

+0

メッセージを送信して別のレイアウトを送信したり、別の人がメッセージを送って別のデザインを表示したりすると、チャットモジュールで作業します –

関連する問題