Android 在我的ListAdapter中设置自定义视图时出现问题
我有一个包含各种元素的列表视图,它会更新很多次。 我想在一些随机位置之后添加一行seperator,比如,在第三元素、第七元素、第十七元素、第十九元素等之后 因此,我设计了一个包含分隔符的xml文件,并使用customAndroid 在我的ListAdapter中设置自定义视图时出现问题,android,listview,android-listview,simpleadapter,Android,Listview,Android Listview,Simpleadapter,我有一个包含各种元素的列表视图,它会更新很多次。 我想在一些随机位置之后添加一行seperator,比如,在第三元素、第七元素、第十七元素、第十九元素等之后 因此,我设计了一个包含分隔符的xml文件,并使用customSimpleAdapter在这些位置将其膨胀。然而,当我运行我的代码时,分隔符被添加到奇怪的位置,使我的列表看起来太难看,有时会出现,不幸的是,你的应用程序已停止错误 我以前从未使用过自定义适配器,也不知道我做错了什么 这是我的简单代码,我添加了注释进行解释 public clas
SimpleAdapter
在这些位置将其膨胀。然而,当我运行我的代码时,分隔符被添加到奇怪的位置,使我的列表看起来太难看,有时会出现,不幸的是,你的应用程序已停止
错误
我以前从未使用过自定义适配器,也不知道我做错了什么
这是我的简单代码,我添加了注释进行解释
public class SpecialAdapter extends SimpleAdapter {
Context context;
private LayoutInflater mInflater;
public SpecialAdapter(Context context, ArrayList<HashMap<String, Object>> newsList, int resource,String[] from, int[] to) {
super(context, newsList, resource, from, to);
this.context = context;
mInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
// TestApp.endPos holds the positions (it keep changing) after which i want to add
// separator
if (position == TestApp.endPos){
/* my Arraylist is of type HashMap<String, Object>
* I have added an empty element and add the seperator view in
* it.
*/
TestApp.arrayList.add(new HashMap<String, Object>());
// heads is an xml file of my separator
view = mInflater.inflate(R.layout.heads, null);
}
return view;
}
}
公共类SpecialAdapter扩展了SimpleAdapter{
语境;
私人停车场;
公共SpecialAdapter(上下文上下文、ArrayList新闻列表、int资源、字符串[]from、int[]to){
超级(上下文、新闻列表、资源、发件人、收件人);
this.context=上下文;
mInflater=(LayoutInflater)上下文
.getSystemService(上下文布局\充气机\服务);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=super.getView(位置、转换视图、父级);
//TestApp.endPos保留我想要添加的位置(它不断变化)
//分离器
如果(位置==测试PP.endPos){
/*我的Arraylist是HashMap类型
*我添加了一个空元素,并在中添加了分隔器视图
*它。
*/
TestApp.arrayList.add(newhashmap());
//heads是我的分隔符的xml文件
视图=最小充气(R.layout.heads,空);
}
返回视图;
}
}
有人能帮我简化我的问题吗?我做错了什么?在您的
getView
方法中,您应该确定是否要使用分隔符查看视图,然后为该项目充气:
if (view == null) {
if (showSeperatorItem)
view = _activity.getLayoutInflater().inflate(R.layout.item__row_layout_with_seperator, parent, false);
else
view = _activity.getLayoutInflater().inflate(R.layout.item__row_layout, parent, false);
}
super.getView
一次可以显示多少视图,就可以显示多少视图。稍后,它将重新使用它们
因为您以后会膨胀自己的布局,所以它会缓存在顶部。最后,super.getView
开始以随机位置返回自定义视图
要克服这个问题,您需要告诉适配器有两种类型的视图,以便它分别缓存它们
以下是示例方法(未经测试,但应可行):
@覆盖
公共视图getView(int位置、视图转换视图、视图组父视图){
如果(位置==测试PP.endPos){
//手动处理分隔符视图
TestApp.arrayList.add(newhashmap());
//如果尚未缓存分隔符,请创建视图
if(convertView==null){
convertView=mInflater.充气(右布局头部,空);
}
}否则{
//普通视图由适配器处理
convertView=super.getView(位置、convertView、父级);
}
返回视图;
}
@凌驾
public int getViewTypeCount(){
//有两种类型:分隔符和普通
返回2;
}
@凌驾
public int getItemViewType(int位置){
如果(位置==测试PP.endPos){
//分隔视图
返回0;
}否则{
//正常视图
返回1;
}
}
注意:有两种类型,意味着两种类型的视图将被缓存和重用。一个更好的解决方案!可能仍然会失败,除非每次调用getView
时都进行充气,否则效率会非常低。@user3249477同意,我不知道您在上面的答案中发布了getItemViewType
。每天都是上学的日子。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (position == TestApp.endPos) {
// Handle separator views manually
TestApp.arrayList.add(new HashMap<String, Object>());
// If separator is not yet cached, create the view
if (convertView == null) {
convertView = mInflater.inflate(R.layout.heads, null);
}
} else {
// Normal views are handled by the adapter
convertView = super.getView(position, convertView, parent);
}
return convertView;
}
@Override
public int getViewTypeCount() {
// There are 2 types: separator and normal
return 2;
}
@Override
public int getItemViewType(int position) {
if (position == TestApp.endPos) {
// Separator view
return 0;
} else {
// Normal view
return 1;
}
}