插入项目时不会更新自定义ListView

时间:2011-07-12 19:35:05

标签: java android

如果我在列表中显示的OnCreate方法中将项目添加到此列表视图中,我有自定义适配器扩展BaseAdapter的自定义列表视图,但是如果我从其他方法添加它们(如数据包侦听器方法),则项目不会显示,在这个列表视图下面的屏幕上有一个文本框,如果我立即使用虚拟键盘选择文本框到entertext,列表视图会填充先前插入的项目,但没有显示。这个活动基本上是一个聊天窗口 我试过调用notifyDataSetChanged,在Layout或listview上无效,但没有任何帮助。

我认为我需要有办法刷新活动,因为当虚拟键盘弹出时必须发生同样的事情。

帮助将受到高度赞赏

由于

代码:

package com.arounds;

公共类ChatActivity扩展了Activity实现OnClickListener,PacketListener {

 private ListView chatView;  
 private ChatListViewCustomAdapter adapter; 
 private String user;
 private XMPPConnection connection;
 private Conversation conv;
 private ChatActivity selfRef = this;
 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        setContentView(R.layout.chat_win);

        AroundApplication app = (AroundApplication) this.getApplicationContext();
        connection = app.getConnection();

        chatView = (ListView) findViewById(R.id.conversationList);  
        adapter = new ChatListViewCustomAdapter(this);  
        chatView.setAdapter(adapter); 

        // set send btn listener
        ImageButton send = (ImageButton)findViewById(R.id.imgBtnSend);
        send.setOnClickListener(this);

        ImageButton smiley = (ImageButton)findViewById(R.id.imgBtnSmiley);
        smiley.setOnClickListener(this);
        // get the parameter passed by previouse activity

        Bundle b = this.getIntent().getExtras();

        String temp = b.getString("user");
        user = temp;

        TextView v = (TextView)this.findViewById(R.id.txtViewTitle_chat);
        v.setText(temp);

        v = (TextView)this.findViewById(R.id.txtViewDescription_chat);
        temp = b.getString("status");
        v.setText(temp);
        //chatView.setOnItemClickListener(this);
        HashMap convs = app.getConversations();

        if(convs.containsKey(user) == true)
            conv = (Conversation) convs.get(user);
        else {
            conv = new Conversation();
            convs.put(user,conv);
        }

        PacketFilter filter = new MessageTypeFilter(Message.Type.chat);
        connection.addPacketListener(this,filter);


 }


@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    if(v.getId() == R.id.imgBtnSend)
    {
    EditText msg = (EditText)this.findViewById(R.id.editChat);
    String s = msg.getText().toString();
     Message message = new Message(user, Message.Type.chat);
     message.setBody(s);
     connection.sendPacket(message);

     ArrayList<ChatMessage> m = conv.messages;
     String currentDate = DateFormat.getDateInstance().format(new Date()); 

     m.add(new ChatMessage(s,currentDate));

     adapter.addItem("I said",s,currentDate,Constants.SEND_LIST_TYPE);
     //adapter.notifyDataSetChanged();
    }
    else
    {
        //View view = this.findViewById(R.id.linerLayoutChat);
        chatView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }
}


@Override
public void processPacket(Packet packet) {
    // TODO Auto-generated method stub
    System.out.println("in");
      Message message = (Message) packet;
      if (message.getBody() != null) {

          System.out.println("in1");
            String fromName = StringUtils.parseBareAddress(message.getFrom());
            ArrayList<ChatMessage> m = conv.messages;
            String currentDate = DateFormat.getDateInstance().format(new Date()); 

            m.add(new ChatMessage(message.getBody(),currentDate));

            adapter.addItem(fromName+" said",message.getBody(),currentDate,Constants.REC_LIST_TYPE);

            //chatView.postInvalidate();
      }
}

}

适配器类:

public class ChatListViewCustomAdapter extends BaseAdapter
 {
public ArrayList<ChatListItem> items;
public Activity context;
public LayoutInflater inflater;
public Boolean temp=false;

public ChatListViewCustomAdapter(Activity context) {
    super();

    this.context = context;
    this.items = new ArrayList<ChatListItem>();
    this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return items.size();
}

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 0;
}

public static class ViewHolder
{

    TextView txtViewTitle;
    TextView txtViewDescription;
    TextView txtViewDate;
}
public void addItem(String title,String desc,String d,int type)
{
    ChatListItem item = new ChatListItem(title,desc,d,type);
    items.add(item);
    notifyDataSetChanged();


}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    ChatListItem item = items.get(position);
    ViewHolder holder;

    System.out.println("Title:"+item.title+" type:"+item.type);
    if(convertView==null)
    {
        holder = new ViewHolder();

        int type = this.getItemViewType(position);
        if(type == 0)
        {
            convertView = inflater.inflate(R.layout.list_item_even, null);
            holder.txtViewTitle = (TextView) convertView.findViewById(R.id.txtViewTitleEven);
            holder.txtViewDescription = (TextView) convertView.findViewById(R.id.txtViewDescriptionEven);
            holder.txtViewDate = (TextView) convertView.findViewById(R.id.txtViewDateEven);

        }
        else
        {
            convertView = inflater.inflate(R.layout.list_item_odd, null);
            holder.txtViewTitle = (TextView) convertView.findViewById(R.id.txtViewTitleOdd);
            holder.txtViewDescription = (TextView) convertView.findViewById(R.id.txtViewDescriptionOdd);
            holder.txtViewDate = (TextView) convertView.findViewById(R.id.txtViewDateOdd);

        }


        convertView.setTag(holder);

    }
    else
        holder=(ViewHolder)convertView.getTag();


    holder.txtViewTitle.setText(item.title);
    holder.txtViewDescription.setText(item.desc);
    holder.txtViewDate.setText(item.date);

    return convertView;
} 
 @Override
 public int getItemViewType(int position) {
     ChatListItem item = items.get(position);
     return item.type;
 }
 @Override
  public int getViewTypeCount() {
      return 2;
  }

}

3 个答案:

答案 0 :(得分:0)

如果notifyDataSetChanged()不起作用,请再次使用相同的ListView调用ListView.setAdapter(),在Adapter上重新设置适配器。这应该刷新视图。

答案 1 :(得分:0)

处理适配器中的所有更新并确保在更新后调用notifyDataSetChanged()(在适配器内)?

答案 2 :(得分:0)

我唯一看不到的是这些方法:

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 0;
}

这些方法应该返回正确的值。

items.get(位置)和位置。