0

У меня есть основное действие и ListFragment, содержащий настраиваемый ArrayAdapter, который является вкладкой этого основного действия. Основное действие имеет AsyncTask, который вытаскивает xml-файл, а затем вызывает другой класс для его анализа при запуске приложения. Данные ListFragment поступают из проанализированных данных, которые AsyncTask. Я хочу, чтобы иметь возможность вызвать пользовательский адаптер ListFragment, чтобы я мог notifyDataSetChanged в onPostExecute метод AsyncTask. Как я могу это сделать?Вызовите настраиваемый метод ArrayAdapter из другого действия

Прямо сейчас, когда я открываю приложение, данные извлекаются и анализируются, но ListView пуст, потому что notifyDataSetChanged не был вызван после завершения AyncTask.

код размещен ниже:

MainActivity

public class MainActivity extends ActionBarActivity { 
    private static final String TAG = MainActivity.class.getSimpleName(); 

    private ActionBar.Tab tab1, tab2; 

    private Fragment fragmentChannels = new ChannelListFragment(); 
    private Fragment fragmentTab2 = new ChannelListFragment(); 

    private ArrayList<Channel> mChannels; 
    private ArrayList<Programme> mProgrammes; 
    private ProgressDialog mProgressDialog; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ActionBar actionBar = getSupportActionBar(); 
     actionBar.setTitle(R.string.app_name); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     actionBar.addTab(actionBar.newTab().setText(R.string.channels_title).setTabListener(new TabListener(fragmentChannels))); 
     actionBar.addTab(actionBar.newTab().setText("tab 2").setTabListener(new TabListener(fragmentTab2))); 

     // Get singleton 
     mChannels = ChannelStore.get(getApplicationContext()).getChannels(); 
     // Populate singleton 
     populateChannels(); 
    } 

    private void populateChannels() { 
     if (CheckNetwork.isInternetAvailable(getApplication())) { 
      ChannelSetup cs = new ChannelSetup(); 
      cs.execute(); 
     } else { 
      Toast.makeText(getApplication(), "No internet connection!", Toast.LENGTH_LONG).show(); 
     } 
    } 

    private class ChannelSetup extends AsyncTask<Void, String, String> { 

     @Override 
     protected String doInBackground(Void... params) { 
      // download xml file 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      try { 
      // parse the xml file and create objects from it. 

      // need to update the listadapter of the listfragment somehow 
     } 
    } 
} 

ChannelListFragment

public class ChannelListFragment extends ListFragment { 
    private static final String TAG = "ChannelListFragment"; 

    private ArrayList<Channel> mChannels; 
    private ChannelAdapter mAdapter; 
    private Date mNow; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getActivity().setTitle(R.string.channels_title); 
     mNow = new Date(); 

     mChannels = ChannelStore.get(getActivity()).getChannels(); 
     Log.i(TAG, "" + mChannels.size() + " " + ""); 

     mAdapter = new ChannelAdapter(mChannels); 
     setListAdapter(mAdapter); 
    } 

    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     Channel c = (Channel) (getListAdapter()).getItem(position); 
     Log.i(TAG, "CH" + c.getId() + " clicked"); 

     Intent i = new Intent(getActivity(), ChannelDetailsActivity.class); 
     i.putExtra(ChannelDetailsFragment.EXTRA_CHANNEL_ID, c.getId()); 
     startActivity(i); 
    } 

    public class ChannelAdapter extends ArrayAdapter<Channel> { 
     public ChannelAdapter(ArrayList<Channel> channels) { 
      super(getActivity(), 0, channels); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      // If we weren't given a view, inflate one 
      if (convertView == null) { 
       convertView = getActivity().getLayoutInflater().inflate(
         R.layout.list_item_channel_table, null); 
      } 

      // do stuff with various text views, etc 

      return convertView; 
     } 

     public void updateListData() { 
      this.clear(); 
      this.addAll(mChannels); 
      this.notifyDataSetChanged(); 
     } 
    } 

} 
+0

Как вы прикрепляете свой фрагмент к своей деятельности? – mmlooloo

+0

Я прикрепляю фрагмент через actionbar.addTab() после того, как я установил режим навигации в первом фрагменте кода – aaearon

ответ

0

Я предлагаю вам создать публичный метод refreshChannels() в вашем ChannelListFragment, который обновляет ChannelAdapter содержание (получение каналов от ChannelStore) и звонка после notifyDataSetChanged(). Вы можете вызвать этот метод в своем методе AsyncTask onPostExecute().

+0

Это то, что я думал, но когда я пытаюсь сказать, что refreshChannels() должен быть статичным, и я не уверен, как Я бы назвал notifydatasetchanged() на моем адаптере в этом статическом общедоступном методе – aaearon

+0

@aaearon, может быть, проблема в том, что вы пытались вызвать 'ChannelListFragment.refreshChannels()' вместо вызова объекта (у вас уже есть глобальные var 'fragmentChannels ') ->' fragmentChannels.refreshChannels() '. (Ваш общедоступный метод не является обязательным статическим, потому что вы вызовете его с помощью объекта) – MartinCR

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