简体   繁体   English

添加新的ListView项目的问题

[英]Issue with adding new ListView Items

I am facing a problem with ListView in Android. 我在Android中遇到ListView问题。 I tried to make a simulation of chat application with some dummy data (first few messages in conversation added in Java code). 我试图用一些虚拟数据(用Java代码添加的会话中的前几条消息)模拟聊天应用程序。

After dummy messages, the user may append message list by entering one explicitly. 在伪消息之后,用户可以通过显式输入消息列表来追加消息列表。 I used boolean to separate sent messages from received, but somehow messages I send to the list appears as received message until I add a new message. 我使用boolean将已发送的消息与已接收的消息分开,但是以某种方式发送到列表的received message显示为已received message直到我添加received message为止。

The first one I added appears like a sent message, but the new one appears as received and so on... I guess it has something with focus but cannot understand well. 我添加的第一个消息看起来像是已发送的消息,但是新消息看起来像已收到的消息,依此类推...我想它具有重点,但不能很好地理解。 There are screenshots of problem and source code. 有问题和源代码的屏幕截图。

adapter class 适配器类

public class MessageAdapter extends BaseAdapter {
    private Context mContext;
    private ArrayList<MessageClass> messagesThreadView;
    private MessageClass msg;
    public MessageAdapter(Context context) {
        this.mContext = context;
        this.messagesThreadView = new ArrayList<MessageClass>();
    }

public void addMessageToThread(MessageClass messageClass) {
    this.messagesThreadView.add(messageClass);
    notifyDataSetChanged();
}

public void removeMessageFromThread (int position) {
    this.messagesThreadView.remove(position);
    notifyDataSetChanged();
}

@Override
public int getCount() {
    return messagesThreadView.size();
}

@Override
public Object getItem(int i) {
    return messagesThreadView.get(i);
}

@Override
public long getItemId(int i) {
    return i;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    View view1 = view;
    MessageClass tempMessageClass = (MessageClass) getItem(i);

    if (view1==null) {
        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view1 = inflater.inflate(R.layout.thread_message_layout, null);
        ViewHolder viewHolder = new ViewHolder();
        viewHolder.message = (TextView) view1.findViewById(R.id.messageContent);
        view1.setTag(viewHolder);
    }

    ViewHolder vh = new ViewHolder();
    vh.message=view1.findViewById(R.id.messageContent);
    if (tempMessageClass.isSentFromMyDevice()) {
        vh.message.setPadding(20,20,50,20);
        vh.message.setGravity(Gravity.END);
    //            vh.message.setTextColor(Color.argb(255, 253,227,17));           
    // converted from colors.xml
        vh.message.setTextColor(Color.argb(255,255,255,255));
        vh.message.setBackgroundColor(Color.argb(255, 114,114,114));    // --||--
        notifyDataSetChanged();
    } else {
        vh.message.setPadding(50,20,20,20);
        vh.message.setGravity(Gravity.START);
        vh.message.setBackgroundColor(Color.argb(175, 253, 227, 17));   // converted from colors.xml @colors/foreground
        notifyDataSetChanged();
    }

    //final ViewHolder viewHolder = (ViewHolder) view1.getTag();
    vh.message.setText(tempMessageClass.text);
    return view1;
}

private class ViewHolder {
    public TextView message = null;
}
}

EDIT: Everything working fine, until I decided to have 2 text colors, one for received messages, second for sent messages. 编辑:一切正常,直到我决定有2种文字颜色,一种用于接收的消息,第二种用于发送的消息。 Now after scrolling up-down, received messages text color has been overwritten by sent message text color. 现在,上下滚动后,接收到的消息文本颜色已被发送的消息文本颜色覆盖。 Any help? 有什么帮助吗?

Add data to adapter first , thn call 首先向适配器添加数据,然后调用

notifyDataSetChanged 

On your adapter 在您的适配器上

Thanks people, changes accepted, and works almost perfect. 谢谢大家,所做的更改都可以接受,并且效果几乎完美。 There is no more left-right moving unexpectedly. 没有更多的左右移动意外。 Now I have one more problem. 现在我还有一个问题。 After incoming messages, reach out of visibility field (when I add new message, focus is always on the newest, and old ones goes on the top). 收到邮件后,请到达可见性字段之外(当我添加新邮件时,始终将焦点放在最新消息上,而将旧消息放在顶部)。 Messages that moved up somehow lose their text, and I only can see background color. 向上移动的邮件会丢失其文本,而我只能看到背景颜色。 After few more messages added, text is shown. 添加更多消息后,将显示文本。 It's not working predictably. 它无法正常工作。

New adapter code is here: 新的适配器代码在这里:

    public View getView(int i, View view, ViewGroup viewGroup) {
    View view1 = view;
    MessageUserDefinedClass tempMessageUserDefinedClass = (MessageUserDefinedClass) getItem(i);

    if (view1 == null) {
        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view1 = inflater.inflate(R.layout.thread_message_layout, null);
        ViewHolder viewHolder = new ViewHolder();
        viewHolder.message = (TextView) view1.findViewById(R.id.messageContent);
        view1.setTag(viewHolder);
    }
    ViewHolder vh = new ViewHolder();
    view1.setTag(vh);
    if (tempMessageUserDefinedClass.isSentFromMyDevice()) {
        vh.message.setPadding(0, 0, 20, 0);
        vh.message.setGravity(Gravity.END);
        vh.message.setTextColor(Color.argb(255, 253, 227, 17));
        vh.message.setBackgroundColor(Color.argb(255, 114, 114, 114));
        notifyDataSetChanged();
    } else {
        vh.message.setPadding(20, 0, 0, 0);
        vh.message.setGravity(Gravity.START);
        vh.message.setBackgroundColor(Color.argb(255, 253, 227, 17)); // converted from colors.xml @colors/foreground
        notifyDataSetChanged();
    }

    final ViewHolder viewHolder = (ViewHolder) view1.getTag();
    viewHolder.message.setText(tempMessageUserDefinedClass.text);
    return view1;
}

I guess it has something with new ViewHolder I added, because first one is created in if statement. 我想它与我添加的新ViewHolder有所关联,因为第一个是在if语句中创建的。 Thanks a lot. 非常感谢。 :) :)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM