Android 如何在片段中包含更多自定义适配器的项?

Android 如何在片段中包含更多自定义适配器的项?,android,listview,android-fragments,android-listview,feed,Android,Listview,Android Fragments,Android Listview,Feed,在我的Fragment中,我显示了来自Web新闻页面的RSS提要,但我只能从一个Url获取这些数据。然后在我的自定义列表视图中显示这个Url的数据。 那么,有没有一种方法可以显示来自多个Url的数据,这些Url显示在不同的ListView中,但显示在相同的片段中? 也许我问的不清楚,如果是的话,请评论并查看我在下面制作的图片: 下面是我片段中的代码: try { URL rssUrl = new URL("URL1"); SAXParserFactory myS

在我的
Fragment
中,我显示了来自Web新闻页面的RSS提要,但我只能从一个
Url
获取这些数据。然后在我的
自定义列表视图中显示这个Url的数据。
那么,有没有一种方法可以显示来自多个Url的数据,这些Url显示在不同的ListView中,但显示在相同的
片段中?
也许我问的不清楚,如果是的话,请评论并查看我在下面制作的图片:

下面是我片段中的代码:

try {
        URL rssUrl = new URL("URL1");
        SAXParserFactory mySAXParserFactory = SAXParserFactory.newInstance();
        SAXParser mySAXParser = mySAXParserFactory.newSAXParser();
        XMLReader myXMLReader = mySAXParser.getXMLReader();
        RSSHandler myRSSHandler = new RSSHandler();
        myXMLReader.setContentHandler(myRSSHandler);
        InputSource myInputSource = new InputSource(rssUrl.openStream());
        myXMLReader.parse(myInputSource);

        myRssFeed = myRSSHandler.getFeed();

    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ParserConfigurationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


    if (myRssFeed!=null)
    {
        ListView list = (ListView)view.findViewById(android.R.id.list);
        CustomList adapter = new CustomList(getActivity(),myRssFeed.getList());
        adapter.addAll();
        list.setAdapter(adapter);

    }
    else
        Toast.makeText(getActivity(), "....",
                Toast.LENGTH_LONG).show();
    return view;
}
编辑 Url的自定义列表视图:

public class CustomList extends ArrayAdapter<RSSItem> {

private static Activity context = null;
private final List<RSSItem> web;
private SharedPreferences mPrefs;
final String read2 = "text1";
final String testoread2 = "img1";

public CustomList(Activity context, List<RSSItem> web) {
    super(context, R.layout.custom_list, web);
    CustomList.context = context;
    this.web = web;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
    LayoutInflater inflater = context.getLayoutInflater();
    final View rowView = inflater.inflate(R.layout.custom_list, null, true);
    mPrefs = PreferenceManager.getDefaultSharedPreferences(context);

    if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }

    ....


    return rowView;

}

首先,我对你的目标有点困惑。您的意思是希望在同一个片段中有单独的ListView,其中每个ListView都显示来自不同URL的项目吗?如果这是你的目标,那么你不应该这样做。在一个滚动列表中有多个ListView真的一点用都不好

但是,您可以做的是构建一个适配器来处理多个URL,并拥有一个ListView(可能这已经是您的目标)。在适配器构造函数中,您将构建一个包含在所有URL中找到的所有提要项的组合列表。您的适配器如下所示:

public class CustomList extends BaseAdapter {

    private final List<FeedItem> itemList;

    public CustomList(List<URL> urlList) {
        itemList = new ArrayList<FeedItem>();
        for (URL rssUrl: urlList) {
            //TODO your code to extract feed items from a URL
            itemList.addAll(myRssFeed.getList());
        }
    }

    @Override
    public int getCount() {
        return itemList.size();
    }

    @Override
    public Object getItem(int position) {
        return itemList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            //TODO inflate your view from XML
        }
        FeedItem feedItem = itemList.get(position);
        //TODO configure convertView using the data in feedItem
        return convertView;
    }
}
公共类CustomList扩展了BaseAdapter{
私人最终清单项目清单;
公共客户列表(列表urlList){
itemList=新的ArrayList();
用于(URL rssUrl:urlList){
//TODO从URL提取提要项的代码
addAll(myRssFeed.getList());
}
}
@凌驾
public int getCount(){
返回itemList.size();
}
@凌驾
公共对象getItem(int位置){
返回itemList.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
if(convertView==null){
//TODO从XML扩展视图
}
FeedItem FeedItem=itemList.get(位置);
//TODO使用feedItem中的数据配置convertView
返回视图;
}
}

我会这样做:

  • 启动此片段后,启动某种加载动画
  • 为您点击的每个URL生成一个单独的线程(或加载程序)(在合理范围内,根据需要进一步安排),并跟踪哪些加载程序已完成。所有加载程序完成后,将它们返回的项目连接到某个对象列表中。由于每个URL返回一个不同的对象,因此创建一个统一的模型,该模型可以知道文章的来源(或文章的类型),并且能够将数据标准化到同一个列表对象中。稍后,当您为它加载视图时,您可以根据它来自的URL对其进行自定义
  • 所有加载程序加载完毕后,停止加载动画,并使用生成的对象列表填充列表视图
    为此,您应该使用LoaderManager使用Loader。下面是一个.

    动态加载它,而不是将ListView放在xml中:

    ListView list = new ListView(this);
    CustomList adapter = new CustomList(getActivity(),myRssFeed.getList());
    adapter.addAll();
    list.setAdapter(adapter);
    
    然后在xml中放置具有以下属性的线性布局:

    android:id="@+id/layoutMain"
    android:orientation="vertical"
    android:layout_height="wrap_content"
    
    返回Java-将列表视图添加到LinearLayout:

    LinearLayout layoutMain = (LinearLayout)findViewById(R.id.layoutMain);
    layoutMain.addView(list);
    
    重复此步骤几次,用多个列表填充片段

    编辑: 关于rsshandler-请创建一个函数来处理这些问题:

    RSSHandler createRssHandler(SAXParserFactory mySAXParserFactory, String url)
    {
        URL rssUrl = new URL(url);
        SAXParser mySAXParser = mySAXParserFactory.newSAXParser();
        XMLReader myXMLReader = mySAXParser.getXMLReader();
        RSSHandler myRSSHandler = new RSSHandler();
        myXMLReader.setContentHandler(myRSSHandler);
        InputSource myInputSource = new InputSource(rssUrl.openStream());
        myXMLReader.parse(myInputSource);
    
       return myRSSHandler;
    }
    
    现在,您可以将其与阵列一起使用:

    String[] urls = new String["url1", "url2"];
    RssHandlers[] handlers = new RssHandlers[urls.length];
    
    for (int i = 0; i < urls.length; i++)
    {
         handlers[i] = createRssHandler(mySAXParserFactory, urls[i]); 
    } 
    
    String[]url=新字符串[“url1”、“url2”];
    RssHandlers[]handlers=新的RssHandlers[url.length];
    for(int i=0;i
    将其与您的列表相结合将产生如下结果:

    String[] urls = new String["url1", "url2"];
    RssHandlers[] handlers = new RssHandlers[urls.length];
    LinearLayout layoutMain = (LinearLayout)findViewById(R.id.layoutMain);
    
    for (int i = 0; i < urls.length; i++)
    {
         handlers[i] = createRssHandler(mySAXParserFactory, urls[i]); 
    
         ListView list = new ListView(this);
         CustomList adapter = new CustomList(getActivity(), handlers[i].getList());
         adapter.addAll();
         list.setAdapter(adapter);
         layoutMain.addView(list);
    } 
    
    String[]url=新字符串[“url1”、“url2”];
    RssHandlers[]handlers=新的RssHandlers[url.length];
    LinearLayout layoutMain=(LinearLayout)findViewById(R.id.layoutMain);
    for(int i=0;i
    很抱歉,我现在有点困惑,我已经有了自定义的ListView。查看编辑我知道,我正试图建议更改您的适配器。您是否将一个URL中的列表项提供给适配器?如果是这样,我的建议是让适配器管理所有URL。但也许我误解了。也许您已经在使用一个适配器,片段中只有一个ListView,并且询问如何从不同的提要配置每个项?答案是,您必须获取每个提要项的数据(在getView中),并相应地修改视图。这有意义吗?抱歉,如果我误解了您的问题。是的,我正在尝试从不同的源配置每个项目。不要担心误解,我没有太多的“语言技能”,所以这不全是你的错。无论如何,谢谢你的关注:)当然,没问题。听起来你的问题是你需要获取不同类型的内容,并将其压缩到同一个视图中?或者内容太不一样了,你真的需要不同的视图布局吗?是这样吗?如果是这样,您可以使用getItemViewType定义不同的视图类型,具体取决于它们来自哪个URL。然后,您可以在getView中展开不同的视图布局。如果你需要更详细的信息,请告诉我。这不是因为内容太不同,我从URL获取的项目只是被称为不同。例如,URL中的图像称为enclosure,而另一个URL中的图像称为ThumbImages,有没有更简单的方法来实现这一点而不加载动画?我只希望对于一个Url,我有一个ListView,而对于其他Url,我有另一个ListView。您不必使用动画,只是您确实需要在单独的线程上执行所有网络交互。和t
    String[] urls = new String["url1", "url2"];
    RssHandlers[] handlers = new RssHandlers[urls.length];
    LinearLayout layoutMain = (LinearLayout)findViewById(R.id.layoutMain);
    
    for (int i = 0; i < urls.length; i++)
    {
         handlers[i] = createRssHandler(mySAXParserFactory, urls[i]); 
    
         ListView list = new ListView(this);
         CustomList adapter = new CustomList(getActivity(), handlers[i].getList());
         adapter.addAll();
         list.setAdapter(adapter);
         layoutMain.addView(list);
    }