2014-09-27 63 views
1

我想在rosterlistener中的状态通知期间用baseadapter更新listview。NotifyDataSetChanged不更新列表视图

但更新的数据没有反映在listview中。请帮帮我。

下面是我的customadapter类。

import java.util.ArrayList; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class ContactAdapter extends BaseAdapter{ 

    private Context mContext; 
    private ArrayList<Contact> Contact_List; 
    Contact contact; 
    String Name,Number,Status; 
    ImageView item_image; 
    TextView tv_Name,tv_Number,tv_Status; 

    public ContactAdapter(Context c, ArrayList<Contact> C_List){ 

     super(); 
     mContext = c; 
     Contact_List = C_List; 

    } 

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

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

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

    @Override 
    public View getView(int arg0, View view, ViewGroup arg2) { 
     LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = inflater.inflate(R.layout.item, null); 
     contact = Contact_List.get(arg0); 
     Name = contact.getName(); 
     Number = contact.getNumber(); 
     Status = contact.getStatus(); 

     tv_Name = (TextView) view.findViewById(R.id.Name); 
     tv_Number = (TextView) view.findViewById(R.id.Number); 
     tv_Status = (TextView) view.findViewById(R.id.status); 

     tv_Name.setText(Name); 
     tv_Number.setText(Number); 
     tv_Status.setText(Status); 

     return view; 

    } 

} 

监听器:

RosterListener update_contacts = new RosterListener() { 

     @Override 
     public void presenceChanged(Presence presence) { 

      String Name="",Status=""; 
      Log.d(Constants.TAG, "Presence value = "+presence); 
      Log.d(Constants.TAG, "Presence getfrom value = "+presence.getFrom()); 
      Log.d(Constants.TAG, "Presence getstatus value = "+presence.getStatus()); 
      Log.d(Constants.TAG, "Presence getto value = "+presence.getTo()); 
      Name = presence.getFrom().substring(0, presence.getFrom().indexOf('@')); 
      Status = presence.getStatus(); 
      Log.d(Constants.TAG, "Name value = "+Name); 
      Log.d(Constants.TAG, "About to update contact list"); 
      RosterOperations.updateContactListByPresenceNotification(Name,Status,Contact_List); 
      for(Contact c : Contact_List){ 
       Log.d(Constants.TAG, "name :"+c.getName()); 
       Log.d(Constants.TAG, "status :"+c.getStatus()); 
       Log.d(Constants.TAG, "number : "+c.getNumber()); 
      } 
      Log.d(Constants.TAG, "About to notify datasetchanged"); 
      contactAdapter.notifyDataSetChanged(); 
      Log.d(Constants.TAG, "notify datasetchanged done"); 

     } 

活动代码:

Collection<RosterEntry> entries; 
    ListView lv_roster; 
    ArrayList<Contact> Contact_List; 
    ContactAdapter contactAdapter; 
    Context context; 
Roster roster; 
    protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_result); 
      context =this; 
      lv_roster = (ListView) findViewById(R.id.user_list); 
      Contact_List = new ArrayList<Contact>(); 
      //Get the Roster from server 
      Log.d(Constants.TAG, "Getting the roster from connection"); 
      roster = MainActivity.connection.getRoster(); 
      roster.addRosterListener(update_contacts); 
      Log.d(Constants.TAG, "Getting the entries from roster"); 
      entries = roster.getEntries(); 
      Log.d(Constants.TAG, "Getting the entries from roster"); 
      RosterOperations.createContactListByRosterEntries(entries,Contact_List,roster); 
      contactAdapter = new ContactAdapter(context, Contact_List); 
      lv_roster.setAdapter(contactAdapter); 
     } 

所以我是缺少在这里才能正常工作..

+0

当您在'presenceChanged()'方法中记录contact_list元素时,是否在logcat中看到更新的值?你也看到''关于通知datasetchanged“'? – 2014-09-27 13:47:02

+0

要使notifyDataSetChanged()正常工作,必须在Contact_List数组上使用add/remove方法。请参阅http://stackoverflow.com/questions/3669325/notifydatasetchanged-example中的答案 – joao2fast4u 2014-09-27 13:48:21

+0

@Misagh是的,我可以看到该日志。 – kavuru 2014-09-27 14:52:34

回答

0

是否你的方法RosterOperations.createContactListByRosterEntries()创建新ArrayList<Contact>实例?如果是的话,您应该先刷新适配器中的数据:

public void setNewData(ArrayList<Contact> newData) { 
    Contact_List.clear(); 
    Contact_List.addAll(newData); 
    this.notifyDataSetChanged(); 
} 
+0

它不会创建新的实例..它的参数列表传递与新的ArrayList 实例和里面的对象被添加了。 – kavuru 2014-09-27 14:51:29

+0

这也不起作用。在contact_list更新后,listview被卡住了。 – kavuru 2014-09-27 17:37:34