添加新的ListView项

时间:2018-04-01 03:54:47

标签: java android listview

我在Android中面临ListView的问题。我尝试使用一些虚拟数据模拟聊天应用程序(在Java代码中添加会话中的前几条消息)。

在虚拟消息之后,用户可以通过明确地输入消息列表来附加消息列表。我使用boolean将收到的已发送邮件分开,但我发送到列表的邮件显示为received message,直到我添加新邮件。

我添加的第一个看起来像是已发送的消息,但是新的消息显示为接收等等...我猜它有焦点但不能理解的东西。有问题和源代码的屏幕截图。

适配器类

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;
}
}
编辑:一切正常,直到我决定有2种文本颜色,一种用于接收消息,第二种用于发送消息。现在在向上滚动后,收到的消息文本颜色已被发送的消息文本颜色覆盖。有什么帮助吗?

2 个答案:

答案 0 :(得分:0)

首先将数据添加到适配器,然后调用

notifyDataSetChanged 

在适配器上

答案 1 :(得分:0)

感谢大家,接受了变化,并且工作几近完美。没有更多的左右移动意外。现在我还有一个问题。传入消息后,伸出可见性字段(当我添加新消息时,焦点始终在最新,而旧消息在顶部)。向上移动的消息会以某种方式丢失文本,我只能看到背景颜色。添加几条消息后,将显示文本。它无法预测。

新的适配器代码在这里:

    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;
}

我想我添加了一些新的ViewHolder,因为第一个是在if语句中创建的。非常感谢。 :)