我正在构建一个聊天应用程序而无法获得左右样式

时间:2018-03-08 11:04:52

标签: android android-recyclerview chat

In this Screenshot

也就是说,当一个设备的发送者发送消息时,它应该出现在右侧,当另一个设备收到消息时,它应该出现在左侧。

我的java类:这是我调用的函数

private void chatRowStyling(boolean isItMe, ViewHolder holder){

    if (isItMe){
        holder.layoutParams.gravity = Gravity.END;
        holder.chatBody.setTextColor(Color.BLUE);
        holder.senderName.setBackgroundResource(R.drawable.speech_bubble_green);

    }else{
        holder.layoutParams.gravity = Gravity.START;
        holder.chatBody.setTextColor(Color.GREEN);
        holder.senderName.setBackgroundResource(R.drawable.speech_bubble_orange);
    }
    Log.i("TAG","error :" + mySnapShot);

    holder.senderName.setLayoutParams(holder.layoutParams);
    holder.chatBody.setLayoutParams(holder.layoutParams);
}

在屏幕截图中,所有消息都显示在右侧,而我希望一个消息显示在右侧,另一个消息显示在不同用户的左侧。

这是我的XML代码:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/singleMessageContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

<TextView
    android:id="@+id/author"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="start"
    android:paddingLeft="12dp"
    android:paddingRight="12dp"
    android:text="@string/sender"
    android:textColor="#2980b9"
    android:textSize="16sp"
    android:textStyle="bold" />


<TextView
    android:id="@+id/message"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="start"
    android:layout_margin="5dip"
    android:padding="12dp"
    android:text="@string/author"
    android:textColor="#2c3e50" />



</LinearLayout>

2 个答案:

答案 0 :(得分:1)

最好的方法是使用单独的视图类型实现 RecyclerView ,这样您可以根据需要调整布局,而无需使用一些阴暗的解决方法。这是一个例子。

参考: How to create RecyclerView with multiple view type?

编辑: 我深信评论,我决定增加一些解释。

您可以创建两个单独的布局,一个用于您的消息:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/tvAuthor"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"/>

    <TextView
        android:id="@+id/tvMessage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/tvAuthor"
        android:layout_alignParentRight="true"/>
</RelativeLayout>

和另一个来自朋友的消息:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/tvAuthor"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/tvMessage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/tvAuthor" />

</RelativeLayout>

然后您可以为您的消息创建一个类:

public class Message {

    private String message;
    private String author;

    public Message(String message, String author) {
        this.message = message;
        this.author = author;
    }

    public String getMessage() {
        return message;
    }

    public String getAuthor() {
        return author;
    }
}

下一步是为RecyclerView创建适配器,该适配器将使用两个单独的ViewHolders,一个用于您的消息,另一个用于来自您朋友的消息。在OnCreateViewHolder中,您可以选择要为每条消息显示的布局。然后在OnBindViewHolder中,您可以使用正确的消息数据填充TextView。

public class MessageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private ArrayList<Message> messages;

    private final static int TYPE_FROM_FRIEND = 1;
    private final static int TYPE_TO_FRIEND = 2;

    public MessageAdapter(ArrayList<Message> messages) {
        this.messages = messages;
    }

    public int getItemViewType(int position) {
        if (messages.get(position).getAuthor().equals("Me")) {
            return TYPE_TO_FRIEND;
        } else {
            return TYPE_FROM_FRIEND;
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        int layout = 0;
        RecyclerView.ViewHolder viewHolder;

        switch (viewType){
            case TYPE_TO_FRIEND:
                layout = R.layout.view_message_to_friend;
                View toFriendView = LayoutInflater
                        .from(parent.getContext())
                        .inflate(layout, parent, false);
                viewHolder=new ToFriendViewHolder(toFriendView);
                break;
            case TYPE_FROM_FRIEND:
                layout = R.layout.view_message_from_friend;
                View fromFriendView = LayoutInflater
                        .from(parent.getContext())
                        .inflate(layout, parent, false);
                viewHolder = new FromFriendViewHolder(fromFriendView);
                break;
            default:
                viewHolder = null;
                break;
        }
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
        int viewType=holder.getItemViewType();
        switch (viewType){
            case TYPE_TO_FRIEND:
                ((ToFriendViewHolder)holder).tvMessage.setText(messages.get(position).getMessage());
                ((ToFriendViewHolder)holder).tvAuthor.setText(messages.get(position).getAuthor());
                break;
            case TYPE_FROM_FRIEND:
                ((FromFriendViewHolder)holder).tvMessage.setText(messages.get(position).getMessage());
                ((FromFriendViewHolder)holder).tvAuthor.setText(messages.get(position).getAuthor());
                break;
        }
    }

    private class ToFriendViewHolder extends RecyclerView.ViewHolder {
        private TextView tvAuthor;
        private TextView tvMessage;

        public ToFriendViewHolder(View view) {
            super(view);
            tvAuthor = (TextView) view.findViewById(R.id.tvAuthor);
            tvMessage = (TextView) view.findViewById(R.id.tvMessage);
        }
    }

    private class FromFriendViewHolder extends RecyclerView.ViewHolder {
        private TextView tvAuthor;
        private TextView tvMessage;

        public FromFriendViewHolder(View view) {
            super(view);
            tvAuthor = (TextView) view.findViewById(R.id.tvAuthor);
            tvMessage = (TextView) view.findViewById(R.id.tvMessage);
        }
    }

    @Override
    public int getItemCount() {
        return messages.size();
    }
}

最后,您可以在活动中设置RecyclerView适配器:

public class MainActivity extends AppCompatActivity {

    private RecyclerView rvMain;
    private ArrayList<Message> messages = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        rvMain = (RecyclerView) findViewById(R.id.rvMain);
        rvMain.setLayoutManager(new LinearLayoutManager(this));
        messages.add(new Message("Hello", "Me"));
        messages.add(new Message("Hi", "Friend"));
        messages.add(new Message("How are you?", "Me"));
        messages.add(new Message("I'm fine and you?", "Friend"));
        MessageAdapter adapter = new MessageAdapter(messages);
        rvMain.setAdapter(adapter);
    }
}

答案 1 :(得分:0)

你可以通过设置视图引力而不是LayoutParams来实现它:

if(isIfMe) {
  holder.linearLayout.setGravity(Gravity.END);
  holder.tvAuthor.setGravity(Gravity.END);

} else {
  holder.linearLayout.setGravity(Gravity.END);
  holder.tvAuthor.setGravity(Gravity.END);
}