我正在开发一个聊天应用,但我无法弄清楚如何根据用户发送/接收器调整消息(重力)。
我尝试了什么:
@Override
public void onBindViewHolder(final MessageDialogViewHolder holder, int position) {
final QBChatMessage item = messageList.get(position);
holder.attachEntity(item);
holder.text.setText(item.getBody());
holder.personName.setText(ChatService.getInstance().getDialogsUsers().get(item.getSenderId()).getFullName());
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
if(item.getSenderId().equals(ChatService.getInstance().getCurrentUser().getId())){
params.gravity = Gravity.END;
holder.container.setGravity(Gravity.END);
}else{
params.gravity = Gravity.START;
holder.container.setGravity(Gravity.START);
}
holder.container.setLayoutParams(params);
}
我的xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/singleMessageContainer"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bubble_b"
android:orientation="vertical">
<ImageView
android:id="@+id/imgMessage"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_gravity="start"
android:visibility="gone"/>
<TextView
android:id="@+id/personName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:textSize="14sp"
/>
<TextView
android:id="@+id/singleMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:layout_margin="5dip"
android:paddingLeft="10dip"
android:text=""
android:textColor="@android:color/primary_text_light"/>
</LinearLayout>
我在这里缺少什么?
感谢您的时间,感谢任何帮助!
答案 0 :(得分:2)
这是我的工作代码:
public class MessageLentItem extends LinearLayout {
public MessageLentItem(Context context, String textMessage, boolean fromMe) {
super(context);
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = layoutInflater.inflate(R.layout.message_lent_item, this);
LinearLayout mainLayout = (LinearLayout) view.findViewById(R.id.mainLayout);
LinearLayout messageLayout = (LinearLayout) view.findViewById(R.id.messageLayout);
TextView messageText = (TextView) view.findViewById(R.id.messageText);
messageText.setText(textMessage);
if (fromMe) {
mainLayout.setGravity(Gravity.RIGHT);
messageText.setPadding(10, 5, 20, 5);
messageLayout.setBackgroundResource(R.drawable.balloon_outgoing_normal);
} else {
mainLayout.setGravity(Gravity.LEFT);
messageText.setPadding(20, 5, 10, 5);
messageLayout.setBackgroundResource(R.drawable.balloon_incoming_normal);
}
}
只需将Linearlayout
替换为xml中的Relative
答案 1 :(得分:1)
将LinearLayout
设为macth_parent
。
设置每个childView的layout gravity
。
LinearLayout.LayoutParams lp = (LinearLayout.layoutParams)holder.personName.getLayoutParams();
lp.gravity = Gravity.LEFT or lp.gravity = Gravity.RIGHT;
holder.personName.setLayoutParams(lp)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/singleMessageContainer"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:src="@mipmap/ic_launcher"
android:id="@+id/imgMessage"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_gravity="left"
android:visibility="visible"/>
<TextView
android:text="left"
android:id="@+id/personName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:textSize="14sp"
/>
<TextView
android:id="@+id/singleMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:layout_margin="5dip"
android:paddingLeft="10dip"
android:text="left"
android:textColor="@android:color/primary_text_light"/>
<ImageView
android:src="@mipmap/ic_launcher"
android:id="@+id/imgMessage1"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_gravity="right"
android:visibility="visible"/>
<TextView
android:text="left"
android:id="@+id/personName1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:textSize="14sp"
/>
<TextView
android:id="@+id/singleMessag1e"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_margin="5dip"
android:paddingLeft="10dip"
android:text="left"
android:textColor="@android:color/primary_text_light"/>
</LinearLayout>
答案 2 :(得分:0)
只需将您的布局文件更改为此
即可<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/singleMessageContainer"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bubble_b"
android:orientation="vertical">
<ImageView
android:id="@+id/imgMessage"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_gravity="start"
android:visibility="gone"/>
<TextView
android:id="@+id/personName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:textSize="14sp"
/>
<TextView
android:id="@+id/singleMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:layout_margin="5dip"
android:paddingLeft="10dip"
android:text=""
android:textColor="@android:color/primary_text_light"/>
刚刚更换 机器人:layout_width =&#34; WRAP_CONTENT&#34; 使用&#34; match_parent&#34;
希望有效。
答案 3 :(得分:0)
试试看 new StaggeredGridLayoutManager(2, GridLayoutManager.VERTICAL);
答案 4 :(得分:-1)
这必须是一个评论,而不是一个aswer,但我还没有获得声望点
我会发一条Log.d()消息:
}else{
params.gravity = Gravity.START;
holder.container.setGravity(Gravity.START);
}
Log.d(TAG, params.gravity + item.getSenderID());
holder.container.setLayoutParams(params);
看看if = else里面的'='是否正常运作。
另外,我会尝试使用RelativeLayout而不是LinearLayout,并使用layout_alignParentStart,layout_alignParentEnd等更改内部元素的layout_gravity。