RecyclerView重力聊天消息

时间:2015-11-19 15:01:19

标签: android android-layout android-recyclerview

我正在开发一个聊天应用,但我无法弄清楚如何根据用户发送/接收器调整消息(重力)。

我尝试了什么:

@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>

我在这里缺少什么?

感谢您的时间,感谢任何帮助!

5 个答案:

答案 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)

enter image description here

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。