Android 调用notifydatasetchanged()时未修改Arrayadapter

Android 调用notifydatasetchanged()时未修改Arrayadapter,android,android-listview,android-arrayadapter,Android,Android Listview,Android Arrayadapter,伙计们,我正在使用一个简单的列表视图。我有两个活动,一个是主要的,另一个是添加朋友 在第二个活动中,我在textbox中获取friend的userid,并将该行添加到数据库中,并更新arraylist。 当我返回mainactivity时,我调用onResume函数中的notifyDataSetChanged,并记录arraylist值。Arraylist非常好,并且该行被插入到数据库中,但listview没有得到更新。我不知道这个问题,请帮忙。这是d代码 public class VayuAc

伙计们,我正在使用一个简单的列表视图。我有两个活动,一个是主要的,另一个是添加朋友 在第二个活动中,我在textbox中获取friend的userid,并将该行添加到数据库中,并更新arraylist。 当我返回mainactivity时,我调用onResume函数中的notifyDataSetChanged,并记录arraylist值。Arraylist非常好,并且该行被插入到数据库中,但listview没有得到更新。我不知道这个问题,请帮忙。这是d代码

public class VayuActivity extends Activity {
    /** Called when the activity is first created. */
    static boolean first_time=true;
    ListView friend_list;
    public static List<String> al;
    public  ArrayAdapter<String> aa;
    String dummyfriends[]={"prashant","monika","pramod","dhara"};
    public static MessengerDataSource mds;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
/*        if(first_time==true)
        {
            first_time=false;
            setContentView(R.layout.registration);
        }
        else */
            setContentView(R.layout.main);

        al=new ArrayList<String>();
        for(String i:dummyfriends)
            al.add(i);

        aa=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, al);

        friend_list=(ListView) findViewById(R.id.friend_list);

        friend_list.setAdapter(aa);

        mds= new MessengerDataSource(getApplicationContext());

        mds.open();

        System.out.println("I m in oncreate");

    }

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();

        al=mds.getFriends();
        aa.notifyDataSetChanged();

        System.out.println("I m in on resume function");
        System.out.println("Value of arraylist in on resume fun"+al);
    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        System.out.println("I m in onpause function");
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
    {


        MenuInflater mi=getMenuInflater();
        mi.inflate(R.menu.mainmenu, menu);

        return true;





    }



    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch(item.getItemId())
        {
        case R.id.add_friend:
            //Toast.makeText(this, "Add Friend", 2000).show();
            Intent i=new Intent(VayuActivity.this,AddFriendActivity.class);
            startActivity(i);
            break;

        case R.id.remove_friend:
            Toast.makeText(this, "Remove Friend", 2000).show();
            break;

        }


        return true;
    }
}



package com.pdd.vayu;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class AddFriendActivity extends Activity implements OnClickListener{

    EditText et;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
         super.onCreate(savedInstanceState);
        setContentView(R.layout.addfriend);

        et=(EditText) findViewById(R.id.E_friendadd);

        Button b=(Button) findViewById(R.id.add_friend_button);
        b.setOnClickListener(this);
    }

    public void onClick(View v) {
        // TODO Auto-generated method stub
        String userid=et.getText().toString();
        //VayuActivity.al.add(f);
        Friend f=new Friend();
        f.setUserid(userid);
        f.setFname("pratik");

        VayuActivity.mds.addFriend(f);
        VayuActivity.al=(ArrayList<String>) VayuActivity.mds.getFriends();
        System.out.println(VayuActivity.al);
        //VayuActivity.aa.notifyDataSetChanged();
    }
}

请帮助

您必须尝试这样的notifyDataSetChanged方法

有时,当您没有在adpter中加载新数据时,它不会加载数据,所以在调用此函数之前,您必须在onresume方法中的arrayadpter中加载数据,而不是onCreate

public void refresh()
    {

        mHandler.postDelayed(new Runnable() {

            @Override
            public void run() {

                ((EfficentAdapter)list.getAdapter()).notifyDataSetChanged(); 
                }           
        }, 100);

    }

要使notifyDataSetChanged正常工作,必须使用ArrayAdapter的add/remove方法(而不是实际列表)将对象添加到ArrayAdapter本身

你的简历应该是这样的:

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();

    //al=mds.getFriends();
    aa.clear();
    aa.addAll(mds.getFriends());
    aa.notifyDataSetChanged();

    System.out.println("I m in on resume function");
    System.out.println("Value of arraylist in on resume fun"+al);
}

ArrayAdapter在启动时创建列表的副本,因此在调用notifyDataSetChanged时,它只查看自己的副本,而不查看源列表

您必须在onresume的ArrayAddter中再次设置a1数据;在列表ArrayAdapter中,如果更改后的数据未重新插入adpter,则不会刷新,因此请像oncreate method aa=new ArrayAdapter这样尝试,android.R.layout.simple_List_item_1,al;我不明白。你能详细说明一下吗?
public void refresh()
    {

        mHandler.postDelayed(new Runnable() {

            @Override
            public void run() {

                ((EfficentAdapter)list.getAdapter()).notifyDataSetChanged(); 
                }           
        }, 100);

    }
@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();

    //al=mds.getFriends();
    aa.clear();
    aa.addAll(mds.getFriends());
    aa.notifyDataSetChanged();

    System.out.println("I m in on resume function");
    System.out.println("Value of arraylist in on resume fun"+al);
}