Java android中的自定义ListView适配器

Java android中的自定义ListView适配器,java,android,listview,android-listview,Java,Android,Listview,Android Listview,我有一个android应用程序,我想在其中显示一些消息。消息分为两类,图像和文本。文本消息有两种类型,发送和接收。我创建了一个自定义listview适配器,以在listview中显示消息。调用适配器时,我传递了一个包含13个对象的arraylist。问题是arraylist中的消息并不是全部都显示。只显示前五条消息。每条消息显示三次。单击listview中的消息项时,会有多条消息处于高位。可能是什么问题。 以下是listview适配器: public class CustomMessageLis

我有一个android应用程序,我想在其中显示一些消息。消息分为两类,图像和文本。文本消息有两种类型,发送和接收。我创建了一个自定义listview适配器,以在listview中显示消息。调用适配器时,我传递了一个包含13个对象的arraylist。问题是arraylist中的消息并不是全部都显示。只显示前五条消息。每条消息显示三次。单击listview中的消息项时,会有多条消息处于高位。可能是什么问题。 以下是listview适配器:

public class CustomMessageListAdapter extends BaseAdapter {
private ArrayList<?> listData;

private LayoutInflater layoutInflater;

public CustomMessageListAdapter(Context context, ArrayList<?> listData) {
    this.listData = listData;
    layoutInflater = LayoutInflater.from(context);
}

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

@Override
public Object getItem(int position) {
    return listData.get(position);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;
    if (convertView == null) {
        convertView = layoutInflater.inflate(R.layout.listview_message,
                null);
        viewHolder = new ViewHolder();

        viewHolder.incoming_message = (RelativeLayout) convertView
                .findViewById(R.id.received_layout);
        viewHolder.outgoing_message = (RelativeLayout) convertView
                .findViewById(R.id.sent_layout);

        viewHolder.sent_message = (TextView) convertView
                .findViewById(R.id.sent_messages_textView_message);
        viewHolder.sent_time = (TextView) convertView
                .findViewById(R.id.sent_messages_textview_time);

        viewHolder.sent_image = (ImageView) convertView
                .findViewById(R.id.sent_image_imageview);
        viewHolder.received_image = (ImageView) convertView
                .findViewById(R.id.received_image_imageview);

        viewHolder.sent_image_layout = (RelativeLayout) convertView
                .findViewById(R.id.sent_image_layout);
        viewHolder.received_image_layout = (RelativeLayout) convertView
                .findViewById(R.id.received_image_layout);

        viewHolder.received_message = (TextView) convertView
                .findViewById(R.id.messages_textView_message);
        viewHolder.received_time = (TextView) convertView
                .findViewById(R.id.messages_textview_time);

        viewHolder.date = (TextView) convertView
                .findViewById(R.id.messages_textView_date);

        viewHolder.sent_hepasnap = (RelativeLayout) convertView
                .findViewById(R.id.chat_layout_sent_hepasnap);
        viewHolder.recieved_hepasnap = (RelativeLayout) convertView
                .findViewById(R.id.chat_layout_received_hepasnap);
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    MessageItem messageItem = (MessageItem) listData.get(position);
    Log.i("msg", "" + position);
    if (messageItem.getCategory().equalsIgnoreCase("text")) {
        if (messageItem.getType().equalsIgnoreCase("sent")) {
            viewHolder.outgoing_message.setVisibility(View.VISIBLE);
            viewHolder.sent_message.setText(messageItem.getMessage());
            viewHolder.sent_time.setText(messageItem.getTime());
        } else {
            viewHolder.incoming_message.setVisibility(View.VISIBLE);
            viewHolder.received_message.setText(messageItem.getMessage());
            viewHolder.received_time.setText(messageItem.getTime());
        }
    }

    return convertView;
}

public class ViewHolder {
    TextView sent_message;
    TextView sent_time;
    TextView received_message;
    TextView received_time;
    RelativeLayout outgoing_message;
    RelativeLayout incoming_message;
    RelativeLayout sent_hepasnap;
    RelativeLayout recieved_hepasnap;
    TextView date;
    ImageView sent_image;
    ImageView received_image;
    RelativeLayout sent_image_layout;
    RelativeLayout received_image_layout;
}

}
公共类CustomMessageListAdapter扩展了BaseAdapter{
私有数组列表数据;
私人停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场;
公共CustomMessageListAdapter(上下文上下文,ArrayList listData){
this.listData=listData;
layoutInflater=layoutInflater.from(上下文);
}
@凌驾
public int getCount(){
返回listData.size();
}
@凌驾
公共对象getItem(int位置){
返回listData.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
持票人持票人;
if(convertView==null){
convertView=LayoutFlater.充气(R.layout.listview\u消息,
无效);
viewHolder=新的viewHolder();
viewHolder.incoming_消息=(RelativeLayout)convertView
.findViewById(R.id.U布局);
viewHolder.outgoing_消息=(RelativeLayout)convertView
.findviewbyd(R.id.sent\u布局);
viewHolder.sent_message=(TextView)convertView
.findviewbyd(R.id.sent\u messages\u textView\u message);
viewHolder.sent_time=(TextView)convertView
.findviewbyd(R.id.sent\u messages\u textview\u time);
viewHolder.sent_image=(ImageView)convertView
.findViewById(R.id.sent\u image\u imageview);
viewHolder.received_image=(ImageView)convertView
.findviewbyd(R.id.received\u image\u imageview);
viewHolder.sent_image_layout=(RelativeLayout)convertView
.findviewbyd(R.id.sent\u image\u布局);
viewHolder.received_image_layout=(RelativeLayout)convertView
.findViewById(R.id.接收的图像布局);
viewHolder.received_message=(TextView)convertView
.findviewbyd(R.id.messages\u textView\u message);
viewHolder.received_time=(TextView)convertView
.findviewbyd(R.id.messages\u textview\u time);
viewHolder.date=(TextView)convertView
.findviewbyd(R.id.messages\u textView\u date);
viewHolder.sent_hepasnap=(RelativeLayout)convertView
.findViewById(R.id.chat\u layou sent\u hepasnap);
viewHolder.Received_hepasnap=(RelativeLayout)convertView
.findViewById(R.id.chat\u layou received\u hepasnap);
convertView.setTag(viewHolder);
}否则{
viewHolder=(viewHolder)convertView.getTag();
}
MessageItem=(MessageItem)listData.get(position);
Log.i(“msg”,位置“+”);
if(messageItem.getCategory().equalsIgnoreCase(“文本”)){
if(messageItem.getType().equalsIgnoreCase(“已发送”)){
viewHolder.outgoing_message.setVisibility(View.VISIBLE);
viewHolder.sent_message.setText(messageItem.getMessage());
viewHolder.sent_time.setText(messageItem.getTime());
}否则{
viewHolder.injecting_message.setVisibility(View.VISIBLE);
viewHolder.received_message.setText(messageItem.getMessage());
viewHolder.received_time.setText(messageItem.getTime());
}
}
返回视图;
}
公共类视图持有者{
TextView发送的消息;
TextView发送时间;
TextView收到_消息;
TextView接收时间;
RelativeLayout传出消息;
RelativeLayout传入_消息;
发送的相对延迟时间;
收到的相关文件;
文本查看日期;
ImageView发送的图像;
ImageView接收到的图像;
发送的相对图像布局;
相对接收的图像布局;
}
}
单击消息时:


添加viewHolder.incoming_message.setVisibility(View.GONE);如果条件

(messageItem.getType().equalsIgnoreCase(“已发送”))

和viewHolder.outing_message.setVisibility(View.GONE);否则的情况


如果您的问题没有解决,请告诉我。

我认为这些消息会显示多次,因为每当convert view为非空时,这些消息都带有旧值

而且,由于你收到的和发出的信息都被填满了,这给人一种多个项目被选中的错觉

所以您应该将未使用视图的可见性更改为View.GONE

是否执行
日志.i(“msg”,位置“+”)打印正确的位置?