Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将消息左/右对齐_Java_Android_Android Layout - Fatal编程技术网

Java 将消息左/右对齐

Java 将消息左/右对齐,java,android,android-layout,Java,Android,Android Layout,我正在使用firebase API。发送和检索消息。但是,我在尝试设置发送者/检索者的布局时遇到了问题,因此消息将左/右对齐。目前,我只有一个布局,发送者/检索者都在使用,但不确定如何设置不同的布局 public class MessageAdapter extends RecyclerView.Adapter<MessageViewHolder> { private List<Message> messagesList; private Databa

我正在使用firebase API。发送和检索消息。但是,我在尝试设置发送者/检索者的布局时遇到了问题,因此消息将左/右对齐。目前,我只有一个布局,发送者/检索者都在使用,但不确定如何设置不同的布局

public class MessageAdapter extends RecyclerView.Adapter<MessageViewHolder> {

    private List<Message> messagesList;

    private DatabaseReference databaseReference;
    private DatabaseReference userDatabaseRef;
    private   FirebaseAuth firebaseAuth;
    private Context context;
   private String imageUrl;


    public MessageAdapter(List<Message> messagesList) {
        this.messagesList = messagesList;
    }

    @Override
    public MessageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Message c = messagesList.get(viewType);
        String sender = c.getFrom();
        databaseReference = FirebaseDatabase.getInstance().getReference().child("Users").child(sender);

            View v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.messages_layout, parent, false);
            return new MessageViewHolder(v);


    }



    @Override
    public void onBindViewHolder(final MessageViewHolder viewHolder, final int index) {


        final Message c = messagesList.get(index);

        final String sender = c.getFrom();

        databaseReference = FirebaseDatabase.getInstance().getReference().child("Users").child(sender);

        databaseReference.addValueEventListener(new ValueEventListener() {

            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                imageUrl = dataSnapshot.child("image").getValue(String.class);

              viewHolder.setUserimage(context,imageUrl);


                String name = dataSnapshot.child("name").getValue().toString();
                viewHolder.displayName.setText(name);

            }
            @Override
            public void onCancelled(DatabaseError databaseError) {
            }

        });

        viewHolder.messageText.setText(c.getMessage());
        viewHolder.time.setText(EpochtimeToDateAndTimeString(c.getTime()));
    }

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


    public String EpochtimeToDateAndTimeString(long time) {
        Date date = new Date(time);
        DateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        format.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
        String formatted = format.format(date);
        return formatted;
    }



}

您应该为发件人和收件人的邮件使用不同的视图持有者

创建两个布局:R.layout.sender\u message\u layoutR.layout.receiver\u message\u layout

创建两个视图持有者:SenderMessageHolderReceiverMessageHolder

定义视图类型整数常量:

public static final int VIEW_TYPE_SENDER = 1;
public static final int VIEW_TYPE_RECEIVER = 2;
在适配器上实现:

if(messageList.get(position).getFrom().equals(...)) {
    return VIEW_TYPE_SENDER;
} else {
    return VIEW_TYPE_RECEIVER;
}
onCreateViewHolder()函数中,检查视图类型并为不同的发件人创建不同的持有者:

View v;

if(viewType == VIEW_TYPE_SENDER) {
    v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.sender_message_layout, parent, false);
    return new SenderMessageHolder(v);
} else {
    v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.receiver_message_layout, parent, false);
    return new ReceiverMessageHolder(v);
}
在onBindViewHolder()中,选中holder实例以相应地将值绑定到视图:

if(holder instanceof SenderMessageHolder) {
    ((SenderMessageHolder) holder).textView.setText(...);
    ...
} else {
    ((ReceiverMessageHolder) holder).textView.setText(...);
    ...
}

希望能有帮助

有几种方法可以做到这一点。我建议的方法是覆盖适配器的
public int-getItemViewType(int-position)
。必须在此处实现逻辑,以帮助确定要返回的布局文件和返回视图类型常量

public static int INCOMING = 1;
public static int OUTGOING = 2;

    @Override
public int getItemViewType(int position) { 
    int viewType = -1;       
    Message m = messagesList.get(position)
    //Logic here determining if m is left or right aligned and  
    // return either 
    // MessageAdapter.OUTGOING OR MessageAdapter.INCOMING
    return viewType;
}
创建左对齐布局文件和右对齐布局文件。新的
onCreateviewHolder()
适配器方法如下所示:

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    Message c = messagesList.get(viewType);
    String sender = c.getFrom();
    databaseReference = FirebaseDatabase.getInstance().getReference().child("Users").child(sender);

    View v;

    if( viewType == MessageAdapter.INCOMING ) {
        v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.messages_layout_left, parent, false);
    }else if ( viewType == MessageAdapter.OUTGOING) {
        v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.messages_layout_right, parent, false);
    }


    return new MessageViewHolder(v);


}

谢谢你的回答。你能帮我确定m是左还是右的逻辑吗?所以我不确定在哪里调用getItemViewtype?
getItemViewtype
被适配器调用。确定m是左还是右的逻辑取决于
消息
对象。从上面的代码中,您可以将
m.getSender()
与当前用户进行比较?可能类似于:
返回m.getSender().equals(currentUser.name())?传入:传出不显式调用getViewType(),因为它的结果作为第二个参数传递到createViewHolder方法中
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    Message c = messagesList.get(viewType);
    String sender = c.getFrom();
    databaseReference = FirebaseDatabase.getInstance().getReference().child("Users").child(sender);

    View v;

    if( viewType == MessageAdapter.INCOMING ) {
        v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.messages_layout_left, parent, false);
    }else if ( viewType == MessageAdapter.OUTGOING) {
        v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.messages_layout_right, parent, false);
    }


    return new MessageViewHolder(v);


}