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