如何在自定义适配器类之外调用NotifyDataSetChanged()?

时间:2014-08-08 04:28:28

标签: android listview

我在一个活动中有一个ArrayList,它使用自定义适配器类填充listView。自定义适配器类代码位于活动中,数据库适配器代码位于自定义适配器类之外的相同活动中。在更新数据库以刷新listView后,我似乎无法弄清楚如何从活动中的自定义适配器类外部调用NotifyDataSetChanged()。我知道我需要在活动中以某种方式创建引用,所以我可以在自定义listView适配器类上调用NotifyDataSetChanged(),但几天之后,这仍然让我无法理解。相信我,我已经阅读并尝试了解决方案,我仍然无法弄清楚这一点。任何帮助将不胜感激。

   public class getServers extends Activity {   

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.server_list); 


//ServerList ArrayList
        ArrayList<ServerList> Items = new ArrayList<ServerList>();                            


        //Create the listview
        ListView listView = (ListView) findViewById(R.id.listView);
        listView.setAdapter(new ServerItemAdapter(this, R.layout.server_list_item, Items));

        listView.setTextFilterEnabled(true);        


//Updates the server status to 0 (Forget)
        public void updateServerStatus(Integer pos) {       
        String ID = gstrServerMacs[pos];        

        //Open the connection to the database adapter   
        DBAdapter db = new DBAdapter(this); 
        db.open();
        //Do the update
        Cursor c = db.updateStatus(ID); 
        c.moveToFirst(); 
        db.close();
        c.close(); 
//Fill the arrays with the updated data from th db                          
        getServerList();

        **I NEED TO CALL NotifyDataSetChanged() HERE!!!**

        }   

//LISTVIEW CLASS START/////////////////////////////////////////////////////////////////////
public class ServerItemAdapter extends ArrayAdapter<ServerList> {
        private ArrayList<ServerList> Items;
        //private String[] values;  

        public ServerItemAdapter(Context context, int textViewResourceId, ArrayList<ServerList> Items) {
            super(context, textViewResourceId, Items);          
            this.Items = Items;
        }

        @SuppressLint("UseValueOf")
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = convertView;       
            if (v == null) {        
                LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.server_list_item, parent, false);
            }

//Array adapter
        public class ServerList {       
            public String ServerName;
            public String ServerMAC;
            public String ServerIP; 

            public ServerList(String ServerName, String ServerMAC, String ServerIP) {
                this.ServerName = ServerName;
                this.ServerMAC = ServerMAC;
                this.ServerIP = ServerIP;       
            }
        }

6 个答案:

答案 0 :(得分:1)

更改

listView.setAdapter(new ServerItemAdapter(this, R.layout.server_list_item, Items));

public class getServers extends Activity {   
   ServerItemAdapter ad = null;
   ...... other codes here

然后在你的onCreate

ad = new ServerItemAdapter(this, R.layout.server_list_item, Items))
listView.setAdapter(ad);

你可以致电

ad.notifyDataSetChanged();

答案 1 :(得分:1)

YourAdapterName.notifyDataSetChanged();

YourAdapterName adapter=new YourAdapterName(this, R.layout.list_item, arrItem)
YourListView.setAdapter(YourAdapterName);

答案 2 :(得分:0)

如果您有权访问创建适配器的活动,则可以向该活动添加一个方法,该方法调用notify adapter并将该acticity传递给添加到db的类。其他方法包括在维护自定义适配器的活动中使用广播和设置本地广播监听器。单身人士也是一个选择,但它们是由垃圾收集器收集所以要小心,因为你可以浪费内存和android dev这是一个宝贵的资源。

而不是使用:

listView.setAdapter(new ServerItemAdapter(this, R.layout.server_list_item, Items));

在活动中将serverItemAdapter的副本作为feild并在onCreate中设置如下:

this.serverItemAdapter = new ServerItemAdapter(this, R.layout.server_list_item, Items));
listView.setAdapter(serverItemAdapter);

答案 3 :(得分:0)

更改以下代码

//Create the listview
ListView listView = (ListView) findViewById(R.id.listView);

ServerItemAdapter adapter=new ServerItemAdapter(this, R.layout.server_list_item, Items)

listView.setAdapter(adapter);

然后调用如下

getServerList();
adapter.notifyDataSetChanged()

答案 4 :(得分:0)

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
      mAdapter.notifyDataSetChanged();}

在你的片段中使用它,然后使用你用来创建适配器的适配器对象调用notifydatasetchanged

答案 5 :(得分:0)

尽管Michael Shrestha的解决方案运行良好,但我只想补充一点,您不需要保留对ServerItemAdapter对象的引用。

如果从外部作用域访问它,可以从ListView对象获取它并进行转换,以便调用notifyDataSetChanged()。像这样:

ServerItemAdapter listAdapter = (ServerItemAdapter) listView.getAdapter();
listAdapter.notifyDataSetChanged();

使用此方法,您可以节省一些内存。

再次,将它留在这里以供将来参考。