2014-08-08 2 views
0

У меня есть ArrayList в активности, которая заполняет listView с использованием пользовательского класса адаптера. Код класса адаптивного адаптера находится в пределах активности, а код адаптера базы данных находится в той же самой активности за пределами настраиваемого класса адаптера. Я не могу понять, как вызвать NotifyDataSetChanged() вне класса пользовательского адаптера в активности после обновления базы данных для обновления спискаView. Я знаю, что мне нужно как-то создавать ссылки, поэтому я могу вызвать 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;  
      } 
     } 
+0

есть у попытался назвать его из экземпляра пользовательский адаптер? –

+0

Мне нужно вызвать его из метода, который обновляет базу данных, которая находится за пределами пользовательского класса адаптера. – raximus

+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(); 
+0

Спасибо, что нашли время, чтобы опубликовать пример. Я попробовал, и я получил эту ошибку: 08-08 01: 11: 53.445: E/AndroidRuntime (15649): FATAL EXCEPTION: main 08-08 01: 11: 53.445: E/AndroidRuntime (15649): java.lang .ArrayIndexOutOfBoundsException: length = 0; index = 0 08-08 01: 11: 53.445: E/AndroidRuntime (15649): – raximus

+0

проверить, возвращены ли данные из базы данных или нет .... попытаться отладить метод getServerList(). –

+0

Ох ... Я просто удалил данные из базы данных, а затем попытался обновить список ничем. Вероятно, это так. – raximus

0

Если у вас есть доступ к деятельности, которая создает адаптер, то вы можете добавить метод к этой деятельности, которая требует уведомить адаптер и передать acticity к классу, который добавляет к вашей БД. Другие методы включают использование широковещательной рассылки и настройку локального широковещательного прослушивателя в операции, которая поддерживает пользовательский адаптер. Синглтоны также являются опцией, но они собираются сборщиком мусора, поэтому будьте осторожны, потому что вы можете тратить память и в android dev, что является драгоценным источником энергии.

Вместо использования:

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

Иметь копию serverItemAdapter как Фейлд в деятельности и установить его, как это в OnCreate:

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

Не могли бы вы взглянуть на небольшую часть моего кода, которую я только что опубликовал, и, возможно, оставить пример того, как я это сделаю? Благодарю. – raximus

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() 
1
YourAdapterName.notifyDataSetChanged(); 

или

YourAdapterName adapter=new YourAdapterName(this, R.layout.list_item, arrItem) 
YourListView.setAdapter(YourAdapterName); 
0
@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
     mAdapter.notifyDataSetChanged();} 

Используйте это в вашем фрагменте, а затем вызвать notifydatasetchanged с помощью объекта адаптера, который вы использовали для создания адаптера

Смежные вопросы