【问题标题】:Pass ListView and ArrayAdpater to another class将 ListView 和 ArrayAdpater 传递给另一个类
【发布时间】:2016-04-07 02:21:52
【问题描述】:

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

该库按描述执行,但我不喜欢如何处理提要输出。基本上在主要活动的私有类中,它直接调用 ListView 和 ArrayAdapter。这意味着如果我想要两个 ListView 显示两个提要,我必须复制整个私有类。我想做的是让它接受传递给它的 ArrayAdapater 和 ListView,这样我就可以关闭该类,然后只需调用它两次,传递相关的提要 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 是使用适配器和 ListView 进行硬编码的,因此根据 Simplistic-RSS 示例代码,我需要创建两个 GetRssFeed 类来生成两个不同的 ListView。我想这样做,所以我有一个GetRssFeed,我可以用相关的适配器和传递给它的 ListView 来调用它。

【问题讨论】:

  • 您可以在AsyncTask中使用接口回调,在数据返回时传回Activity。在 AsyncTask 中保持视图有缺点
  • @MikeM。 ListView上如何设置Adapter?

标签: java android class listview android-arrayadapter


【解决方案1】:

在 GetRssFeed 类中,添加一个接受 url 和 listview 2 个参数的构造函数,如果要更改适配器,请添加 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();

【讨论】:

  • 我试过这样格式化它,但因为它是一个扩展 ASyncTask 的类,所以它不喜欢这种格式。它给出了一个错误说Class or interface expected
  • 对不起,我试过了,它工作正常..我会编辑我的答案等待
  • @JamesKrawczyk,在 AsyncTask 中添加构造函数工作正常。请检查我编辑的答案
  • 我已经实现了这一点,它在课堂上一直有效,但奇怪的是 for 循环不再迭代 rssReader.getItems() 的长度。我添加了一个测试变量来确认.getItems() 的长度,它有20 个项目,但在运行adapter.add() 一次后退出。
  • 没关系,这是由在 MainActivity 中将 ListView 设置为 Adapter 引起的,正如另一条评论中所推荐的那样。
猜你喜欢
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
  • 2013-12-10
  • 2013-07-24
  • 2020-12-30
  • 2011-03-15
相关资源
最近更新 更多