2013-03-14 97 views
0

在我的应用程序中,我有一个带有“部分”的ListView。对于每个项目,我都添加了一个字母,但仅对于以该字母开头的第一个字词才可见。它工作正常,但如果我在我的ListView中向下滚动,订单更改,这意味着该信件将转到下一个项目。ListView刷新GetView()

例子:

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; 


     } 

     } 

我在做什么错?

+2

添加您在适配器上使用的代码。 – madlymad 2013-03-14 09:33:10

回答

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。去除convertVire = null;声明,雅鼎建议和2.去除环境if (convertView == null) {包括关闭}围绕string cnv_char... old_char = cnv_char块。请务必正确设置convertView,因为它不保证是新鲜的对象。

第二个,您的代码依赖getView()被调用的特定顺序,情况并非如此。目前,您正在依靠old_char设置为最后一个项目的起始字母(按它们在列表中的显示顺序)。这不是保证。

我建议您使用position参数来访问列表的前一个条目(当然除外),并检查是否有差异,如果没有前导或显示当前项目的起始字母以不同的字母开头。

+0

不幸的是,我不知道如何实现这个我的代码。 – lukso 2013-03-14 10:41:27

+0

@lukso你可以描述一下你试图遵循这个方案时遇到的问题。 – 2013-03-14 10:44:28

+0

我正在使用C#并且发布的是Java。这就是为什么我不能实现这一点。 – lukso 2013-03-14 11:02:39

0

的ListView重用堆栈意见,以取代被向上滚动至底部

尝试作为之前添加以下语句中的代码再次把它的观点: -

convertView = NULL;

之前它检查

如果(convertView == NULL);

+0

将它添加到您的customListAdapter的getView()方法中。 – 2013-03-14 09:31:18

+1

值得注意的是,这种建议的方法 - 忽略视图的回收 - 绝对不是Android对getView()实现的期望,它也不会节省应用程序的任何努力 - 如何设置现有的对象比创建一个新创建的对象效率低?此外,如果原始海报发生了特定的执行错误,您的解决方案只会解决问题,这是不能保证的。如果你先问他,如果你指出你的解决方案不是Android-ish,那本来是很好的。 – 2013-03-14 10:07:13