gpt4 book ai didi

android - 具有任意数量行类型的 ListView 适配器(不知道不同行类型的数量)

转载 作者:行者123 更新时间:2023-11-29 15:22:01 25 4
gpt4 key购买 nike

所以,我正在制作这个应用程序。该应用程序解析网站,或更具体地说是 vbulletin-board。当我解析论坛中的一个线程时,我将它分开,这样当我解析该线程中的每个帖子时,我会在诸如此类的部分中获得帖子的实际内容,并以正确的顺序存储这些部分在数组中:

[Plain text]
[Quote from somebody]
[Plain text]
[Another quote]
[Another quote again]
[Some more plain text]

但是,如您所知,帖子可以按任何顺序排列,并且可以包含比示例中更多或更少的部分,并且它也不必包含引号,或者它可能只是一个或几个引号。一切皆有可能。

当我在我的应用程序中列出帖子时,我使用的是 ListView。此 ListView 的每一行将始终包含一个标题,以及前面提到的部分的任意组合。

我在谷歌上搜索了一下之后想到的方法是在一个 XML 文件中有一个只有一个布局标签的“基本布局”,每个部分都有一个单独的布局,存储在单独的 XML 中-files,并在我的适配器中每次调用 getView() 时,查看我的“帖子列表”中该位置的帖子,然后遍历该特定帖子中的部分,并膨胀一个新的“Quote-layout”对于存储在帖子中的每个引用部分,并为帖子中的每个纯文本部分膨胀一个“纯文本布局”。对于每一个,我都会填写属于该帖子的所有内容。

我认为这可行,但可能存在性能问题?据我了解,布局膨胀非常昂贵,而且我也无法回收传递给 getView() 的 View ,因为它可能添加了一堆部分,而我在另一次调用 getView 时可能不需要().. 也就是说,如果我对 getView() 和回收有所了解的话。

这是适配器的 getView() 方法的基本示例:

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
// Inflate the base-layout, which the others are added to.
view = mInflater.inflate(R.layout.forum_post,null);

View header = mInflater.inflate(R.layout.post_header_layout, null);
View message = mInflater.inflate(R.layout.post_text_layout, null);
View quote = mInflater.inflate(R.layout.post_quote_layout, null);

((ViewGroup)view).addView(header);
((ViewGroup)view).addView(message);
((ViewGroup)view).addView(quote);
return view;
}

然后当我从已保存的帖子列表中提取数据时,根据需要增加更多的引用 View /消息 View 。

基本布局只是一个 LinearLayout 标签

我膨胀的布局只是添加了一些 TextView 和一个 ImageView 的 RelativeLayouts。

此代码产生此结果,其中我有一个 Header用户名、图片等,一段纯文本,一段引述。不过,这似乎并不是一直都能正常工作,因为当我刚才尝试它时,列表的副本似乎卡在背景上,而另一个列表的副本在它上面滚动..

http://s14.postimg.org/rizid8q69/view.png

有更好的方法吗?因为我想这不是很有效

最佳答案

您需要覆盖 getViewItemTypegetViewTypeCount

getItemViewType(int position) - 返回您应该根据位置使用哪种布局类型的信息

然后仅当布局为 null 时才扩充布局,并使用 getItemViewType 确定类型。

示例:

   private static final int TYPE_ITEM1 = 0;
private static final int TYPE_ITEM2 = 1;
private static final int TYPE_ITEM3 = 2;
@Override;
public int getItemViewType(int position)
{
int type;
if (position== 0){ // your condition
type = TYPE_ITEM1; //type 0 for header
} else if(position == 1){
type = TYPE_ITEM2; //type 1 for message
}else {
type = TYPE_ITEM3; //type 2 for Quote
}
return type;
}
@Override
public int getViewTypeCount() {
return 3; //three different layouts to be inflated
}

getView

 int type= getItemViewType(i); // determine type using position.
switch (type) {
case TYPE_ITEM1:
view= mInflater.inflate(R.layout.post_header_layout, null); // inflate layout for header
break;
case TYPE_ITEM2:
view = mInflater.inflate(R.layout.post_text_layout, null); // inflate layout for quote
break;
case TYPE_ITEM3:
quote = mInflater.inflate(R.layout.post_quote_layout, null); // inflate layout for message
break;
....

您需要使用 View Holder 来实现流畅的滚动和性能。

http://developer.android.com/training/improving-layouts/smooth-scrolling.html

您可以查看下面的教程

http://android.amberfog.com/?p=296

关于android - 具有任意数量行类型的 ListView 适配器(不知道不同行类型的数量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17370525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com