私は2人の参加者からのメッセージを反対のアライメント(他のユーザーは左揃え、自分のmsgは右寄せ)にしたいアプリでチャットモジュールを作成しています。今、私の行レイアウトは静的レイアウトxml(msgとアバターを左揃えにして)で渡されます。ビューを動的に変更する方法はありますか、実行時に選択するUIシステムの代替行レイアウトを渡す方法はありますか?リストビューの行レイアウトを動的に変更
答えて
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);
1つのXMLファイルに両方のビューを表示する方法です(これはベストプラクティスかどうかはわかりません)。実行時には、(findViewByIdを使用して)各ビューへの参照を取得し、可視プロパティを不要なものに設定することができます。
どうすればよいでしょうか?
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メソッドに種類に応じて、ビューを膨らま)
マイコード:
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);
}
}
}
チャットモジュールのみ –
あなたのコードにいくつかの説明を加えてください。 – Jan
メッセージを送信して別のレイアウトを送信したり、別の人がメッセージを送って別のデザインを表示したりすると、チャットモジュールで作業します –
- 1. Androidリストビュー行テキスト動的に変更
- 2. 変更のリストビューを自動的に更新 - knockoutjsとJQuery Mobile
- 3. リストビューのヘッダーセルの数を動的に変更するLayoutTemplate
- 4. Javafx listview動的にリストビューのセルの色を変更する
- 5. リストビューのバックカラーを動的に変更する方法
- 6. リストビューの太字とイタリックに動的に変更します
- 7. レイアウトを動的に作成する(リストビューに似ています)
- 8. 動的に変更した後に別のレイアウトをオーバーレイするレイアウト
- 9. 変更相対的なレイアウトの幅と高さを動的
- 10. Android:私のViewPagerのレイアウトを動的に変更する方法
- 11. 複数行レイアウトのリストビュー
- 12. Android - レイアウトの背景色を動的に変更する
- 13. Androidのレイアウトを動的に変更する
- 14. ビューのレイアウトを自動的に変更する
- 15. フラグメントのレイアウトを動的に変更する方法
- 16. AlertDialogのレイアウトとフィールドを動的に変更する方法
- 17. アプリケーション内のレイアウトが動的に変更される
- 18. リストビューの行のフォントを変更する
- 19. 動的リストビューの実行時の列
- 20. リストビューの行の高さをリストアイテムの数に基づいて動的に変更します
- 21. レイアウト内のリストビュー
- 22. リストビューの変更 - 奇妙な動作
- 23. 数動的リストビュー
- 24. リストビューの高さをプログラム的に変更するには?
- 25. 動的レイアウトを使用してプログラムでリストビューにアイテムを追加する
- 26. 相対的なレイアウトをプログラム的に変更する
- 27. 画像のリストビューを動的に更新する
- 28. アンドロイドのリストビューのレイアウト
- 29. 変更ボタンクラスを動的に
- 30. 変更CSSを動的に
ああ、それはなんとかですか?私は以前simplecursoradapterを使っていたので、ビューIDの配列のint [] []の代わりにint [] []を渡したカスタムsimplecursoradapterをやってしまった。 – jingyin