为什么我的Android自定义适配器样式是随机行?
我有一个简单的自定义适配器,用于显示度数列表。我试图添加一种方法,在列表中创建一种子标题,将类似的内容分组在一起。每一行都有一个标题和一个描述,所以我要做的是当它膨胀一个描述设置为null的行时,它会更改行的样式(隐藏描述并将标题居中)。我遇到的问题是,将样式应用于随机行,而不是仅应用于具有空值的行(随机行上的标题将居中,其他随机行上的描述将隐藏) 我的getView:为什么我的Android自定义适配器样式是随机行?,android,android-arrayadapter,Android,Android Arrayadapter,我有一个简单的自定义适配器,用于显示度数列表。我试图添加一种方法,在列表中创建一种子标题,将类似的内容分组在一起。每一行都有一个标题和一个描述,所以我要做的是当它膨胀一个描述设置为null的行时,它会更改行的样式(隐藏描述并将标题居中)。我遇到的问题是,将样式应用于随机行,而不是仅应用于具有空值的行(随机行上的标题将居中,其他随机行上的描述将隐藏) 我的getView: public View getView(int position, View convertView, ViewGroup p
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if(v == null) {
LayoutInflater inflater = LayoutInflater.from(mContext);
v = inflater.inflate(R.layout.links_list, null);
}
TextView tvTitle = (TextView)v.findViewById(R.id.txtTitle);
TextView tvDesc = (TextView)v.findViewById(R.id.txtDesc);
if(mainList.get(position) instanceof Program) {
Program row = (Program) mainList.get(position);
if(row.getTitle() != null && row.getType() == null) {
//this condition should style just the ones with null type, but style random rows instead
tvTitle.setText(row.getTitle());
tvTitle.setGravity(Gravity.CENTER);
tvDesc.setVisibility(View.GONE);
} else {
if(row.getTitle() != null) {
tvTitle.setText(row.getTitle());
}
if(row.getType() != null) {
tvDesc.setText(row.getType());
}
}
}
return v;
}
所以我的问题是,为什么这种样式的行是随机的,而不仅仅是我告诉它的行?重新考虑if-else条件,并且列表视图中的视图被重用,所以请在“普通视图”中撤消重力条件
tvTitle.setGravity(Gravity.CENTER);tvDesc.setVisibility(View.GONE)代码>能否详细说明if-else条件?我看不出它们有什么问题,要作为子标题处理的对象将具有空类型和标题值。好的,所以在普通视图上撤消重力,因为视图是重复使用的。对不起,我不理解撤消重力的意思?你是说去掉那两条设定重力和能见度的线?那么我如何有条件地设置单行的样式呢?哦,我想我明白你所说的视图被重用的意思了。让我看看我是否明白了…因此,如果我将可见性设置为GONE,则下一行充气时仍将使用GONE。我只是假设它在每次执行此代码时都会重置为xml布局。谢谢你的帮助!是的,这就是重点。如果希望可见性可见,则必须将其设置为可见。XML不会被重新加载,因为该视图无法被重用
if(mainList.get(position) instanceof Program) {
Program row = (Program) mainList.get(position);
if(row.getTitle() != null && row.getType() == null) {
//this condition should style just the ones with null type, but style random rows instead
tvTitle.setVisibility(View.VISIBLE);
tvTitle.setText(row.getTitle());
tvTitle.setGravity(Gravity.CENTER);
tvDesc.setVisibility(View.GONE);
} else {
tvTitle.setVisibility(View.GONE);
tvTitle.setGravity(Gravity.LEFT);
tvDesc.setVisibility(View.VISIBLE);
if(row.getTitle() != null) {
tvTitle.setText(row.getTitle());
}
if(row.getType() != null) {
tvDesc.setText(row.getType());
}
}
}