将 ListView 和 ArrayAdapter 传递给另一个 class

Pass ListView and ArrayAdpater to another class

我正在尝试实现这个库 https://github.com/ShirwaM/Simplistic-RSS

该库按照描述的方式运行,但我不喜欢处理提要输出的方式。基本上在主activity中的私有class里面它直接调用了ListView和ArrayAdapter。这意味着如果我想要两个 ListView 显示两个提要,我必须复制整个私有 class。我想要做的是让它接受传递给它的 ArrayAdapater 和 ListView,这样我就可以关闭 class,然后调用它两次,传递相关的提要 URL 和 ListView 以进行输出。

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;


public class MainActivity extends Activity
{
    private ListView mList;
    private ListView lList;
    ArrayAdapter<String> adapter;
    ArrayAdapter<String> adapterSecond;

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

        lList = (ListView) findViewById(R.id.listTwo);
        mList = (ListView) findViewById(R.id.listOne);

        adapterSecond = new ArrayAdapter<String>(this, R.layout.basic_list_item);
        adapter = new ArrayAdapter<String>(this, R.layout.basic_list_item);
        new GetRssFeed().execute("http://feeds.arstechnica.com/arstechnica/index");
        new GetRssFeedSecond().execute("http://feeds.skynews.com/feeds/rss/home.xml");
    }

    private class GetRssFeed extends AsyncTask<String, Void, Void>
    {
        @Override
        protected Void doInBackground(String... params)
        {
            try
            {
                RssReader rssReader = new RssReader(params[0]);
                Integer i = 0;
                for (RssItem item : rssReader.getItems())
                {
                    adapter.add(item.getTitle());
                    i++;
                    if(i == 7)
                    {
                        break;
                    }
                }

            } catch (Exception e)
            {
                Log.v("Error Parsing Data", e + "");
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid)
        {
            super.onPostExecute(aVoid);
            adapter.notifyDataSetChanged();
            mList.setAdapter(adapter);
        }
    }

    private class GetRssFeedSecond extends AsyncTask<String, Void, Void>
    {
        @Override
        protected Void doInBackground(String... params)
        {
            try
            {
                RssReader rssReader = new RssReader(params[0]);
                Integer i = 0;
                for (RssItem item : rssReader.getItems()) {
                    adapter.add(item.getTitle());
                    i++;
                    if (i == 7) {
                        break;
                    }

                }
            } catch (Exception e)
            {
                Log.v("Error Parsing Data", e + "");
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid)
        {
            super.onPostExecute(aVoid);
            adapterSecond.notifyDataSetChanged();
            lList.setAdapter(adapterSecond);
        }
    }

}

如您所见,因为 GetRssFeed 是使用 Adapter 和 ListView 硬编码的,根据 Simplistic-RSS 示例代码,我需要创建两个 GetRssFeed classes 来生成两个不同的 ListView。我想做到这一点,所以我有一个 GetRssFeed,我可以用相关的 Adapter 和传递给它的 ListView 来调用它。

在 GetRssFeed Class 中,添加接受 2 个参数的构造函数,url 和列表视图,如果要更改适配器,则添加 3 个参数,如下所示。

public GetRssFeed(String feedUrl, ListView listView) {
   this.feedUrl = feedUrl;
   this.listView = listView;

}

在 GetRssFeed class 中将这 2 个变量定义为实例变量并使用它们。

然后,在 onCreate 中,您可以像下面这样调用,

new GetRssFeed("http://feeds.arstechnica.com/arstechnica/index", listView).execute();

您的单个 AsyncTask 将如下所示,

 private class GetRssFeed extends AsyncTask<String, Void, Void>
{
    ListView listView;
    String url;
    ArrayAdapter adapter;

    public GetRssFeed(String url, ListView listView, ArrayAdapter adapter) {
        this.listView = listView;
        this.url = url;
        this.adapter = adapter;
    }
    @Override
    protected Void doInBackground(String... params)
    {
        try
        {

            Log.d("tag", "nayana url "+url);
            RssReader rssReader = new RssReader(params[0]);
            Integer i = 0;
            for (RssItem item : rssReader.getItems())
            {
                adapter.add(item.getTitle());
                i++;
                if(i == 7)
                {
                    break;
                }
            }

        } catch (Exception e)
        {
            Log.v("Error Parsing Data", e + "");
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid)
    {
        super.onPostExecute(aVoid);
        adapter.notifyDataSetChanged();
        mList.setAdapter(adapter);
    }
}

从 onCreate 开始,您调用

new GetRssFeed("http://feeds.arstechnica.com/arstechnica/index", lList, ADAPTER).execute();
    new GetRssFeed("http://feeds.skynews.com/feeds/rss/home.xml", mList, adapterSECOND).execute();