【问题标题】:How to set the list item to the right when the message is sent?发送消息时如何将列表项设置在右侧?
【发布时间】:2017-04-29 04:19:00
【问题描述】:

问题是列表中的每个项目都左对齐。但是,我想区分发送的消息和传入的消息。

我有两个布局文件:

我的MessageAdapter 类中有这个if 声明:

 if (convertView == null) {
    convertView = ((Activity) getContext()).getLayoutInflater().inflate(R.layout.item_message_right_admin, parent, 
 }

这是我的应用截图:

我在 Stack Overflow 上看到了一个关于同一问题的 post。我找到了线索,但我 无法实施。任何人都可以建议我这样做吗?以下是线索。 因此,每当用户按下发送按钮时,他的消息应该在右侧。传入的消息应该在左边。

if (convertView == null) {
        if (list.get(position).getTypeOfSms().equals("send"))
            convertView     = myInflater.inflate(R.layout.raw_left, null);
        else
            convertView     = myInflater.inflate(R.layout.raw_right, null);

当用户点击发送按钮时,应该怎么做才能使发送的消息向右对齐?

【问题讨论】:

    标签: android xml android-layout android-arrayadapter


    【解决方案1】:

    像这样改变你的适配器代码,

    import android.app.Activity;
    import android.content.Context;
    import android.util.Log;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    import java.util.List;
    
    
    public class MessageAdapter extends ArrayAdapter<Message> {
    
    
        private static final int ROW_TYPE_LEFT = 0;
        private static final int ROW_TYPE_RIGHT = 1;
    
        private List<Message> messagesList;
    
        public MessageAdapter(Context context, int resource, List<Message> objects) {
            super(context, resource, objects);
            this.messagesList = objects;
        }
    
        @Override
        public int getViewTypeCount() {
            return 2;
        }
    
        @Override
        public int getItemViewType(int pos) {
            return messagesList.get(pos).isDelivered() ? ROW_TYPE_LEFT : ROW_TYPE_RIGHT ;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
              // Gets the message that we are displaying at a position
            Message message = getItem(position);
    
            Log.d("TAG", "message: " + message);
    
            // Check if an existing view is being reused, otherwise inflate the view
            if (convertView == null) {
                int rowType = getItemViewType(position);
                switch (rowType)
                {
                    case ROW_TYPE_RIGHT:
                        convertView = ((Activity) getContext()).getLayoutInflater().inflate(R.layout.item_message_right_admin, parent, false);
                        break;
                    case ROW_TYPE_LEFT:
                        convertView = ((Activity) getContext()).getLayoutInflater().inflate(R.layout.item_message_left_user, parent, false);
                        default:
                }
    
            }
    
            // Lookup view for data population
            ImageView photoImageView = (ImageView) convertView.findViewById(R.id.photoImageView);
            TextView messageTextView = (TextView) convertView.findViewById(R.id.messageTextView);
            TextView authorTextView = (TextView) convertView.findViewById(R.id.nameTextView);
    
            boolean isPhoto = message.getPhotoUrl() != null;
    
            if (isPhoto) {
                messageTextView.setVisibility(View.GONE);
                photoImageView.setVisibility(View.VISIBLE);
                Glide.with(photoImageView.getContext())
                        .load(message.getPhotoUrl())
                        .into(photoImageView);
            } else {
                messageTextView.setVisibility(View.VISIBLE);
                photoImageView.setVisibility(View.GONE);
                messageTextView.setText(message.getText());
            }
    
            authorTextView.setText(message.getName());
    
            // Return the completed view to render on screen
            return convertView;
        }
    
    }
    

    并在Message 模型中添加isDelivered 方法。

    【讨论】:

    • 欣赏它。 isDelivered() 方法是否返回我应该添加到 Message 类中的布尔值?
    • @PC。是或您的逻辑来查找消息的状态
    • java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.List.get(int)' on a null object reference at com.pc.wecare.MessageAdapter.getItemViewType(MessageAdapter.java:34) 我在尝试您的代码时遇到了这个异常。你能告诉我哪里出错了。正如你所说,我更新了我的Message 课程。
    • 我在 Message 类中添加了这个方法 - public boolean isDelivered(){ return true; }
    • 他非常慷慨,一直在我身边,直到我的问题得到解决。感谢您的耐心和持续的支持! @Krish
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 2017-01-22
    • 2020-09-27
    • 2017-12-05
    相关资源
    最近更新 更多