将ListView和ArrayAdpater传递给另一个类

时间:2016-04-07 02:21:52

标签: java android class listview android-arrayadapter

我正在尝试实施此库https://github.com/ShirwaM/Simplistic-RSS

库如上所述,但我不喜欢如何处理Feed输出。基本上在主活动的私有类中,它直接调用ListView和ArrayAdapter。这意味着如果我想要两个显示两个Feed的ListView,我必须复制整个私有类。我想要做的是让它接受一个ArrayAdapater和ListView传递给它,这样我就可以关闭该类,然后只需调用它两次传递相关的feed 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类来生成两个不同的ListView。我想这样做,所以我有一个GetRssFeed我可以调用相关的Adapter和ListView传递给它。

1 个答案:

答案 0 :(得分:1)

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

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

}

将GetRssFeed类中的这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();