【问题标题】:Listview with two xml's changing when scrolling滚动时有两个 xml 变化的 Listview
【发布时间】:2014-08-20 10:30:32
【问题描述】:

目前我正在为我的应用程序处理消息传递页面。问题是我在列表视图中使用了两个不同的 xml。现在我可以让数据以正确的顺序显示在页面上,但是,当我滚动时,数据仍然以正确的顺序显示,但样式不同。例如,在滚动最后一条消息之前,如果我向上滚动则使用 messagesent.xml,然后向下滚动相同的消息现在具有 message.xml 样式。我目前使用的代码如下。

public class MessagingAdapter extends ArrayAdapter<MessagingObject> {


private static final String userID = "USERID";
private static final int TYPE_ITEM1 = 0;
private static final int TYPE_ITEM2 = 1;

public String newid;
public Context context;
public ArrayList<MessagingObject> object = new ArrayList<MessagingObject>();

int type;

public MessagingAdapter(Context context, int textViewResourceId, ArrayList<MessagingObject> objects) {
    super(context, textViewResourceId, objects);
    this.context = context;
    this.object = objects;
}

@Override
public int getItemViewType(int position) {

    if (userID.equals(newid)) {
        type = TYPE_ITEM1;
    } else {
        type = TYPE_ITEM2;
    }
    return type;
}

@Override
public int getViewTypeCount() {

    return 2;
}

@Override
public View getView(int position, View convertview, ViewGroup parent) {


    MessagingObject i = object.get(position);
    newid = i.getMessageID();

    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    convertview = inflater.inflate(R.layout.messagesright_layout, null);

    if (convertview == null) {
        convertview = inflater.inflate(R.layout.messagesright_layout, null);
    }

    if (type == TYPE_ITEM1) {
       convertview = inflater.inflate(R.layout.messagesright_layout, null);
       TextView sentmessage = (TextView) convertview.findViewById(R.id.messagesent_text);
       sentmessage.setText(object.get(position).getMessage());

       TextView senttime = (TextView) convertview.findViewById(R.id.messagesentTime);
       String senttimestring = new String().valueOf(object.get(position).getTimeStamp());
       senttime.setText(senttimestring);

      } else {
       convertview = inflater.inflate(R.layout.messages_layout, null);
       TextView message = (TextView) convertview.findViewById(R.id.message_text);
       message.setText(object.get(position).getMessage());

       TextView time = (TextView) convertview.findViewById(R.id.messageTime);
       String timestring = new String().valueOf(object.get(position).getTimeStamp());
       time.setText(timestring);
     }
    return convertview;
}

现在我知道这与 Listview 回收有关,但是,我尝试了一些我在其他堆栈溢出帖子上找到的解决方案,但没有运气,而且我无法找到很多解决这个问题的方法2个xml。

感谢您的观看!

【问题讨论】:

    标签: java android android-listview android-xml


    【解决方案1】:

    我编写了一个列表,其中包含 2 个 xml 用于列表中不同行的布局,但我没有看到这个问题。

    我不会将视图类型存储在局部变量中,而是我总是在“getView”的开头调用“getItemViewType”,因此我可以保证获得当前位置的正确视图类型,请参阅我对您的调整下面的代码(我没有检查这个编译)


    public class MessagingAdapter extends ArrayAdapter<MessagingObject> {
    
    
    private static final String userID = "USERID";
    private static final int TYPE_ITEM1 = 0;
    private static final int TYPE_ITEM2 = 1;
    
    public String newid;
    public Context context;
    public ArrayList<MessagingObject> object = new ArrayList<MessagingObject>();
    
    int type;
    
    public MessagingAdapter(Context context, int textViewResourceId, ArrayList<MessagingObject> objects) {
        super(context, textViewResourceId, objects);
        this.context = context;
        this.object = objects;
    }
    
    @Override
    public int getItemViewType(int position) {
    
        if (userID.equals(newid)) {
            return = TYPE_ITEM1;
        } else {
            return = TYPE_ITEM2;
        }
    }
    
    @Override
    public int getViewTypeCount() {
    
        return 2;
    }
    
    @Override
    public View getView(int position, View convertview, ViewGroup parent) {
    
    
        MessagingObject i = object.get(position);
        newid = i.getMessageID();
    
        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
        if (getItemViewType(position) == TYPE_ITEM1) {
           convertview = inflater.inflate(R.layout.messagesright_layout, null);
           TextView sentmessage = (TextView) convertview.findViewById(R.id.messagesent_text);
           sentmessage.setText(object.get(position).getMessage());
    
           TextView senttime = (TextView) convertview.findViewById(R.id.messagesentTime);
           String senttimestring = new String().valueOf(object.get(position).getTimeStamp());
           senttime.setText(senttimestring);
    
          } else {
           convertview = inflater.inflate(R.layout.messages_layout, null);
           TextView message = (TextView) convertview.findViewById(R.id.message_text);
           message.setText(object.get(position).getMessage());
    
           TextView time = (TextView) convertview.findViewById(R.id.messageTime);
           String timestring = new String().valueOf(object.get(position).getTimeStamp());
           time.setText(timestring);
         }
        return convertview;
    

    【讨论】:

    • 如果我可以为你投票一千次,我会的。完美运行!
    【解决方案2】:

    您的getView 错误。只有当convertView 为空时,您才应该询问该位置的类型并膨胀视图。

    @Override
    public View getView(int position, View convertview, ViewGroup parent) {
    
    
    MessagingObject i = object.get(position);
    newid = i.getMessageID();
    int type = getItemViewType(position);
    
    if (convertview == null) {
        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (type == TYPE_ITEM1) {
           convertview = inflater.inflate(R.layout.messagesright_layout, null);
        } else if (type == TYPE_ITEM2) {
           convertview = inflater.inflate(R.layout.messages_layout, null);
        }
    }
    
    if (type == TYPE_ITEM1) {
       TextView sentmessage = (TextView) convertview.findViewById(R.id.messagesent_text);
       sentmessage.setText(object.get(position).getMessage());
    
       TextView senttime = (TextView) convertview.findViewById(R.id.messagesentTime);
       String senttimestring = new String().valueOf(object.get(position).getTimeStamp());
       senttime.setText(senttimestring);
    
      } else {
    
       TextView message = (TextView) convertview.findViewById(R.id.message_text);
       message.setText(object.get(position).getMessage());
    
       TextView time = (TextView) convertview.findViewById(R.id.messageTime);
       String timestring = new String().valueOf(object.get(position).getTimeStamp());
       time.setText(timestring);
     }
    return convertview;
    }
    

    【讨论】:

    • 感谢您带来的类型!我没想到。我实现了您的建议,尽管消息页面加载它很快崩溃:“E/AndroidRuntime:FATAL EXCEPTION: main java.lang.NullPointerException at com.Activities.Adapters.MessagingAdapter.getView(MessagingAdapter.java:84)”这点到我在文本字段中添加文本的位置。
    • 如果此时你有一个 NPE,这意味着你在布局中没有你正在寻找的视图。尝试仔细检查它
    【解决方案3】:
    try this:
    
    if (convertview == null) {
    
    if (type == TYPE_ITEM1) {
       convertview = inflater.inflate(R.layout.messagesright_layout, null);
       TextView sentmessage = (TextView) convertview.findViewById(R.id.messagesent_text);
       sentmessage.setText(object.get(position).getMessage());
    
       TextView senttime = (TextView) convertview.findViewById(R.id.messagesentTime);
       String senttimestring = new String().valueOf(object.get(position).getTimeStamp());
       senttime.setText(senttimestring);
    
      } else {
       convertview = inflater.inflate(R.layout.messages_layout, null);
       TextView message = (TextView) convertview.findViewById(R.id.message_text);
       message.setText(object.get(position).getMessage());
    
       TextView time = (TextView) convertview.findViewById(R.id.messageTime);
       String timestring = new String().valueOf(object.get(position).getTimeStamp());
       time.setText(timestring);
     }
    

    【讨论】:

    • 刚刚试了一下,但我有同样的问题。数据加载,但当我滚动它交换边。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    相关资源
    最近更新 更多