【问题标题】:Listview items changes while scrolling in android.. How to avoid it?在android中滚动时Listview项目发生变化..如何避免它?
【发布时间】:2017-09-21 04:42:31
【问题描述】:

我一直在开发一个应用程序来使用 firebase 发送和接收消息,当所有消息都在同一侧时,消息看起来很干净。..

适配器:

     @Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = ((Activity) getContext()).getLayoutInflater().inflate(R.layout.item_message, parent, false);
    }
        ImageView photoImageView = (ImageView) convertView.findViewById(R.id.photoImageView);
        TextView messageTextView = (TextView) convertView.findViewById(R.id.messageTextView);
        TextView authorTextView = (TextView) convertView.findViewById(R.id.nameTextView);
        LinearLayout layout = (LinearLayout) convertView.findViewById(R.id.image_container);
        FriendlyMessage message = getItem(position);
        boolean isPhoto = message.getPhotoUrl() != null;
        if (isPhoto) {
            messageTextView.setVisibility(View.GONE);
            layout.setVisibility(View.VISIBLE);
            layout.setMinimumHeight(200);
            photoImageView.setVisibility(View.VISIBLE);
            Glide.with(photoImageView.getContext())
                    .load(message.getPhotoUrl())
                    .into(photoImageView);
        } else {
            messageTextView.setVisibility(View.VISIBLE);
            photoImageView.setVisibility(View.GONE);
            layout.setVisibility(View.GONE);
            layout.setMinimumHeight(0);
            messageTextView.setText(message.getText());
        }


        messageTextView.setText(message.getText());
        authorTextView.setText("." + message.getName());


    return convertView;

但我想让用户在右侧拥有自己的消息,所以写了一个下面加粗的代码,它起初工作正常,滚动所有移位到右侧..尝试覆盖 getviewcounttype 但无法正确实现......任何更改代码或防止项目转移的解决方案..

This Image is working fine at first

Upon Scroll all gets moved to right

这是上述更改的代码

     @Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = ((Activity) getContext()).getLayoutInflater().inflate(R.layout.item_message, parent, false);
    }
        ImageView photoImageView = (ImageView) convertView.findViewById(R.id.photoImageView);
        TextView messageTextView = (TextView) convertView.findViewById(R.id.messageTextView);
        TextView authorTextView = (TextView) convertView.findViewById(R.id.nameTextView);
        LinearLayout layout = (LinearLayout) convertView.findViewById(R.id.image_container);
        FriendlyMessage message = getItem(position);
        boolean isPhoto = message.getPhotoUrl() != null;
        if (isPhoto) {
            messageTextView.setVisibility(View.GONE);
            layout.setVisibility(View.VISIBLE);
            layout.setMinimumHeight(200);
            photoImageView.setVisibility(View.VISIBLE);
            Glide.with(photoImageView.getContext())
                    .load(message.getPhotoUrl())
                    .into(photoImageView);
        } else {
            messageTextView.setVisibility(View.VISIBLE);
            photoImageView.setVisibility(View.GONE);
            layout.setVisibility(View.GONE);
            layout.setMinimumHeight(0);
            messageTextView.setText(message.getText());
        }
        //Modified part to displaying messages on right
        try {
            if (user.getDisplayName().equalsIgnoreCase(message.getName())) {
                System.out.println("At Gravity" + user.getDisplayName().toString() + message.getName());
               messageTextView.setGravity(Gravity.RIGHT);
                authorTextView.setGravity(Gravity.RIGHT);
                layout.setGravity(Gravity.RIGHT);
                messageTextView.setMaxWidth(200);
             authorTextView.setTextColor(Color.CYAN);
            }
        } catch (NullPointerException e) {
            System.out.println("Exception catched");
        }
        messageTextView.setText(message.getText());
        authorTextView.setText("." + message.getName());


    return convertView;

此问题的任何可能解决方法???

【问题讨论】:

    标签: android listview android-studio messages


    【解决方案1】:

    您需要添加一个 else 语句,因为 ListView 重用了它的项目视图。一旦将视图设置为右侧,它就没有机会自行将其对齐方式更改回左侧。

    if (user.getDisplayName().equalsIgnoreCase(message.getName())) {
        System.out.println("At Gravity" + user.getDisplayName().toString() + message.getName());
        messageTextView.setGravity(Gravity.RIGHT);
        authorTextView.setGravity(Gravity.RIGHT);
        layout.setGravity(Gravity.RIGHT);
        messageTextView.setMaxWidth(200);
        authorTextView.setTextColor(Color.CYAN);
    }else{
        messageTextView.setGravity(Gravity.LEFT);
        authorTextView.setGravity(Gravity.LET);
        layout.setGravity(Gravity.LEFT);
        messageTextView.setMaxWidth(200);
        authorTextView.setTextColor(Color.CYAN);
    }
    

    【讨论】:

    • 感谢您的回答......是的,使用 else 很简单,而且它工作得很好......被其他人发布的许多其他方法弄糊涂了,比如覆盖 getcount 等等......
    【解决方案2】:

    请在您的适配器中使用 setTag() 和 getTag(), 但更好的做法是使用RecyclerView 而不是ListView

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      相关资源
      最近更新 更多