在我的应用程序中,我有一个带有“sections”的ListView。对于每个项目,我添加了一个字母,但它们仅对以该字母开头的第一个单词可见。它工作正常,但如果我在ListView中向下滚动,订单会更改,这意味着该字母将转到下一个项目。
示例:
A
--
- Alligator
- Ant
- Antelope
- Ape
但是当我向下滚动时,会发生以下情况:
- Aligator
A
--
- Ant
- Antelope
- Ape
添加我在GetView()
中实现的字母的函数我该如何解决这个问题? 我看到ListView在滚动时刷新,如何禁用刷新?或者还有另一种解决方法吗?
protected string old_char = "";
public override View GetView(int position, View convertView, ViewGroup parent)
{
var item = sw_items [position];
View view;
convertView = null;
view = (convertView ??
this.context.LayoutInflater.Inflate (Resource.Layout.ItemLayout,
parent,
false)) as LinearLayout;
var txtTitle = view.FindViewById<TextView> (Resource.Id.txtTitle);
txtTitle.SetText (sw_items [position].name, TextView.BufferType.Normal);
var alfabet = view.FindViewById<TextView> (Resource.Id.alfabet);
var linAlfabet = view.FindViewById<LinearLayout> (Resource.Id.Lin_Alfabet);
if (convertView == null) {
string cnv_char = item.name [0].ToString ().ToUpper ();
alfabet.Text = cnv_char;
if (cnv_char != old_char) {
alfabet.Visibility = ViewStates.Visible;
linAlfabet.Visibility = ViewStates.Visible;
} else {
alfabet.Visibility = ViewStates.Gone;
linAlfabet.Visibility = ViewStates.Gone;
}
//saving previous char
old_char = cnv_char;
}
return view;
}
}
我做错了什么?
答案 0 :(得分:1)
<强>修强>
首先,getView()
实施的基本方案如下。
if (convertView == null) {
// the system does not want me to recycle a view object, so create a new one
LayoutInflater inflater = (LayyoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.your_layout_file, parent, false);
}
// here, set up the convertView object, no matter whether it was recycled or not
...
return convertView;
根据您发布的代码段,您可能需要做的就是:1。删除Yatin建议的convertVire = null;
语句,然后删除周围的if (convertView == null) {
,包括关闭}
string cnv_char... old_char = cnv_char
块。确保为convertView
正确设置所有内容,因为它不能保证是新鲜的对象。
第二,您的代码依赖于按特定顺序调用getView()
,但实际情况并非如此。目前,您依赖old_char
设置为最后一项的起始字母(按照它们在列表中的显示顺序)。这不是保证。
我建议您使用position
参数来访问列表的上一个条目(当然除了第一个条目除外)并检查差异,如果没有前任,则显示当前项目的起始字母或者如果它以不同的字母开头。
答案 1 :(得分:0)
ListView重用堆栈中的视图来替换向上滚动的视图以将其再次放置在底部
尝试在代码中添加以下语句: -
<强> convertView = NULL; 强>
在检查之前
如果(convertView == NULL); 强>