【问题标题】:ListView Refreshing GetView()ListView 刷新 GetView()
【发布时间】:2013-03-14 08:33:29
【问题描述】:

在我的应用程序中,我有一个带有“部分”的 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;


        }

      }

我做错了什么?

【问题讨论】:

  • 添加您在适配器上使用的代码。

标签: c# android listview xamarin


【解决方案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;

鉴于您发布的代码 sn-p,您可能需要做的就是:1. 删除 Yatin 建议的 convertVire = null; 语句,以及 2. 删除周围的 if (convertView == null) {,包括关闭 string cnv_char... old_char = cnv_char 周围的 }堵塞。确保为convertView 正确设置所有内容,因为不能保证它是新对象。

第二,您的代码依赖于以特定顺序调用的getView(),但事实并非如此。目前,您依赖 old_char 设置为最后一项的起始字母(按照它们在列表中出现的顺序)。这是没有保证的。

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

【讨论】:

  • 不幸的是,我不知道如何在我的代码中实现这一点。
  • @lukso 您能否描述一下您在尝试遵循此方案时遇到的问题。
  • 我使用的是 C#,而您发布的是 Java。这就是为什么我无法实现它。
  • 好的。鉴于您发布的代码 sn-p,您可能需要做的就是:1. 删除 Yatin 建议的 convertVire = null; 语句和 2. 删除周围的 if (convertView == null) {,包括在 string cnv_char... old_char = cnv_char 块周围关闭 },然后您应该没问题。
  • 我跟着你的步骤,但现在我又回到了以前的情况。
【解决方案2】:

ListView 重用堆栈中的视图来替换向上滚动的视图以将其再次放置在底部

尝试在之前的代码中添加以下语句:-

convertView=null;

在它检查之前

if(convertView==null);

【讨论】:

  • 将它添加到您的 customListAdapter 的 getView() 方法中。
  • 值得注意的是,这种建议的方法——忽略视图的回收——绝对不是Android对getView()实现的期望,它也不会为应用程序节省任何努力——如何设置一个现有的对象会不如设置一个新创建的对象有效吗?此外,您的解决方案只有在原始发布者犯了特定的实施错误时才能解决问题,这是不能保证的。如果您先问他,并且指出您的解决方案不是 Android-ish,那就太好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
相关资源
最近更新 更多