Call custom ArrayAdapter method from another Activity

删除回忆录丶 提交于 2020-01-17 02:41:27

问题


I have a main activity and a ListFragment containing a custom ArrayAdapter that is a tab of that main activity. The main activity has an AsyncTask that pulls down an xml file then calls another class to parse it when the app starts. The ListFragment data comes from the parsed data that the AsyncTask. I want to be able to call the custom adapter of the ListFragment so that I can notifyDataSetChanged in the onPostExecute method of the AsyncTask. How can I accomplish this?

Right now, when I open the app, the data gets pulled and parsed but the ListView is empty because notifyDataSetChanged hasn't been called after the AyncTask is done.

Code is posted below:

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();
        }
    }

 }

回答1:


I suggest you to create a public method refreshChannels() in your ChannelListFragment that updates the ChannelAdapter content (getting the channels from the ChannelStore) and calling after notifyDataSetChanged(). You could call this method on your AsyncTask onPostExecute() method.



来源:https://stackoverflow.com/questions/25595051/call-custom-arrayadapter-method-from-another-activity

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!