2011-07-12 36 views
0

我有自定義的適配器擴展BaseAdapter的自定義列表視圖如果我添加項目到這個列表視圖他們顯示在列表中的OnCreate方法,但如果我從其他方法添加他們像一個數據包聽衆的方法,然後項目不顯示,在這個listview下面的屏幕上有一個文本框,如果我選擇文本框使用虛擬鍵盤輸入電子郵件立即listview獲取填充先前插入的項目沒有出現。此活動基本上是一個聊天窗口 我已經嘗試調用notifyDataSetChanged,在佈局或listview上無效,但沒有任何幫助。插入項目時自定義ListView不更新

我認爲我需要有一種方法來刷新活動,因爲彈出虛擬鍵盤時必須發生同樣的事情。

幫助將高度讚賞

由於

代碼:

包com.arounds;

公共類ChatActivity擴展活動實現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; 
    } 

}

+1

在任何人都可以幫助你解決問題之前,你需要展示一些代碼。我的猜測是,你可能錯過了notifyDatasetChanged調用。 –

+0

添加代碼請參閱 – Vishal

回答

0

在情況下notifyDataSetChanged()不起作用,重 - 在上設置適配器通過再次呼叫ListView.setAdapter()Adapter相同。這應該刷新視圖。

+0

試過這個,但沒有幫助,是否有任何與Listener方法和GUI線程相關的問題? – Vishal

0

處理適配器中的所有更新,並確保在更新之後(在適配器內)調用notifyDataSetChanged()

+0

我已經說過,它的工作原理oncreate,我打電話給notifyDataSetChanged方法 – Vishal

+0

那麼你是否「處理適配器中的所有更新」?並在其末尾調用「notifyDataSetChanged()」?或者是否有某處你明確地從外部調用適配器的notifyDataSetChanged()(或者更可能不是)? –

+0

我正在添加物品到arraylist內適配器,然後調用notifydatasetchanged只有 – Vishal

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(position)and position分別。

+0

做到了,但我不thik它真的很重要,因爲仍然沒有用,仍然listview不會更新當我收到消息 – Vishal

+0

你確定你在processPacket方法中沒有任何異常?我沒有看到代碼有任何問題。嘗試在您的addItem方法中放入一些日誌消息,並查看消息是否真的被添加到適配器中。 –

+0

謝謝,他們肯定得到添加只是沒有得到顯示,證明是當我點擊一個列表項或嘗試輸入一些文本到文本框,這是在列表視圖的底部清單得到刷新和recived項目得到顯示我相信processPacket方法工作正常,沒有任何異常 – Vishal