android – 如何在ListView中正确使用TextSwitcher?

前端之家收集整理的这篇文章主要介绍了android – 如何在ListView中正确使用TextSwitcher?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
ListView中每条记录的TextSwitcher应显示第一个值(text1),然后显示另一个值(text2),然后再显示第一个值,依此类推.只有当text2不为空时才会发生.否则应始终显示text1(不进行任何更改和动画).

我创建了Runnable(),它更改了布尔变量(time2),然后调用items.notifyDataSetChanged().它按预期工作,并在结果setViewValue()中调用我的ListView.

这是代码

items.setViewBinder(new SimpleCursorAdapter.ViewBinder() {

    @Override
    public boolean setViewValue(View view,Cursor cursor,int columnIndex) {
      int viewId = view.getId();
      switch(viewId) {
      case R.id.timetext:
          TextSwitcher itemTime = (TextSwitcher) view;
          if (itemTime.getChildCount() != 2) {
              itemTime.removeAllViews();
              itemTime.setFactory(new ViewSwitcher.ViewFactory() {
                  @Override
                  public View makeView() {
                      TextView t = new TextView(MyActivity.this);
                      t.setTextSize(18);
                      t.setTypeface(null,Typeface.BOLD);
                      t.setTextColor(Color.WHITE);
                      return t;
                    }
                  });
              itemTime.setAnimateFirstView(true);
              itemTime.setInAnimation(AnimationUtils.loadAnimation(MyActivity.this,R.anim.push_up_in));
              itemTime.setOutAnimation(AnimationUtils.loadAnimation(MyActivity.this,R.anim.push_up_out));
          }

          if (!text2.equals("")) {
              if (!time2) {
                  itemTime.setText(text1);
              } else {
                  itemTime.setText(text2);
              }
          } else {
                      itemTime.setCurrentText(text1);
              }
          return true;
      } 
      return false;
    }
  } );

它几乎按预期工作.使用一个次要项目 – 当应显示text2时,它首先将显示的值更改为其他值(来自另一个记录!),然后播放动画. text2到text1的更改正确发生.

我的理解原因如下 – 在显示text2之前,itemTime的所有视图都被删除,因此它被重新创建,这就是为什么一些其他值被显示为秒的原因.但为什么它显示其他记录的价值呢?

实际上text2和text1是数据库中的值,例如.@H_502_13@text2 = cursor.getString(cursor.getColumnIndexOrThrow(DbAdapter.KEY_TIME_2)),可能,这里出了点问题,用错误的参数调用了setViewValue?

UPD.在setViewValue从数据库中读取text1和text2.以下是完整代码的示例:

itemTime.setText(cursor.getString(cursor.getColumnIndexOrThrow(DbAdapter.KEY_CLOSE_TIME_1)) + " - " + cursor.getString(cursor.getColumnIndexOrThrow(DbAdapter.KEY_OPEN_TIME_1)));

解决方法

我想我看到这里发生了什么,这是因为ListView的工作方式.

ListView在内部回收其所有视图,因此您只能创建可在屏幕上显示的视图.但是,这也意味着当您将值绑定到setViewValue方法中的视图时,并不总是会给出之前在列表中位于相同位置的视图.

假设您有三个列表项:itemA,itemB,itemC.每个都分别包含text1,text2和text3.

当你调用items.notifyDataSetChanged()时,ListView会回收所有这些列表项但感觉就像,所以你可能得到一个新的itemC,itemA,itemB的订单;然后文本将读取text3,text1,text2.

因此,当您将第一个列表项的文本更改为“text2”时,您实际上会看到“text3”更改为“text2”,而不是像您期望的那样从“text1”转换为“text2”.

猜你在找的Android相关文章