LA_*_*LA_ 8 sqlite android android-listview
我TextSwitcher的每个记录ListView应显示第一个值(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是数据库中的值,例如.
text2 = cursor.getString(cursor.getColumnIndexOrThrow(DbAdapter.KEY_TIME_2)),可能,这里出了点问题并setViewValue用错误的参数调用?
UPD.text1和text2是从数据库中读取的setViewValue.以下是完整代码的示例:                      
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”。
| 归档时间: | 
 | 
| 查看次数: | 1849 次 | 
| 最近记录: |