Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“如何加载Listview”;“顺利”;在android中_Android_Listview - Fatal编程技术网

“如何加载Listview”;“顺利”;在android中

“如何加载Listview”;“顺利”;在android中,android,listview,Android,Listview,我将数据从游标加载到listview,但我的listview并没有真正显示“平滑”。当我在ListView中的scollbar上下拖动时,数据会发生变化。有些项目在我的列表中看起来像重复显示。 我有一个“复杂的ListView”(两个textview,一个imageview),所以我使用newView(),bindView()来显示数据。有人能帮我吗?我将向您介绍如何解决您遇到的此类问题。这可能对你有帮助 因此,在列表适配器中有这样的代码: public View getView(int pos

我将数据从游标加载到listview,但我的listview并没有真正显示“平滑”。当我在ListView中的scollbar上下拖动时,数据会发生变化。有些项目在我的列表中看起来像重复显示。
我有一个“复杂的ListView”(两个textview,一个imageview),所以我使用newView(),bindView()来显示数据。有人能帮我吗?

我将向您介绍如何解决您遇到的此类问题。这可能对你有帮助

因此,在列表适配器中有这样的代码:

public View getView(int position, View contentView, ViewGroup arg2)
    {
        ViewHolder holder;

        if (contentView == null) {
            holder = new ViewHolder();
            contentView = inflater.inflate(R.layout.my_magic_list,null);
            holder.label = (TextView) contentView.findViewById(R.id.label);
            contentView.setTag(holder);
        } else {
            holder = (ViewHolder) contentView.getTag();
        }

        holder.label.setText(getLabel());

        return contentView;
    }
正如您所看到的,我们仅在检索holder之后才设置列表项的值

但如果将代码移到上面的if语句中:

holder.label.setText(getLabel());
因此,它将如下所示:

if (contentView == null) {
   holder = new ViewHolder();
   contentView = inflater.inflate(R.layout.my_magic_list,null);
   holder.label = (TextView) contentView.findViewById(R.id.label);
   holder.label.setText(getLabel());
   contentView.setTag(holder);
}
您将拥有列表项复制的当前应用程序行为


它可能会有所帮助。

ListView是一个狡猾的野兽

首先是第二个问题:您看到的是重复的,因为ListView通过convertView重新使用视图,但您不能确保重置转换视图的所有方面。确保
convertView的代码路径正确=null
正确设置视图的所有数据,所有内容都应该正常工作

如果使用的是自定义视图,则希望
getView()
方法大致如下所示:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    final MyCustomView v = convertView!=null ? (MyCustomView)convertView : new MyCustomView();
    v.setMyData( listAdapter.get(position) );
    return v;
}
如果您没有使用自己的自定义视图,只需将调用
new MyCustomView()
替换为调用
inflater.inflate(R.layout.my\u layout,null)

关于你的第一个问题,你可以在这里观看Romain的关于ListView性能的techtalk:

从他的谈话和我自己的经历来看

  • 使用convertView
  • 如果您有图像,请不要动态缩放图像。使用Bitmap.createScaledBitmap创建缩放位图并将其放入视图中
  • 使用ViewHolder,这样就不必每次都调用一堆FindViewById()
  • 降低listview中视图的复杂性。子视图越少越好。相对论在这方面要比线性布局好得多。如果要实现自定义视图,请确保使用

    • 我也面临这个问题,但在我的例子中,我使用线程来获取外部图像。如果重用imageView,则当前执行线程不要更改它,这一点很重要

      public View getView(int position, View vi, ViewGroup parent) {
      ViewHolder holder;
      String imageUrl = ...;
      
      if (vi == null) {
          vi = inflater.inflate(R.layout.tweet, null);
          holder = new ViewHolder();
          holder.image = (ImageView) vi.findViewById(R.id.row_img);
          ...
          vi.setTag(holder);
      } else {
          holder = (ViewHolder) vi.getTag();      
      }
      holder.image.setTag(imageUrl);
      ...
      DRAW_MANAGER.fetchDrawableOnThread(imageUrl, holder.image);
      }
      
      然后在获取线程上,我正在执行重要检查:

      final Handler handler = new Handler() {
      @Override
      public void handleMessage(Message message) {
           // VERY IMPORTANT CHECK
          if (urlString.equals(url))
              imageView.setImageDrawable((Drawable) message.obj);
      };
      
      Thread thread = new Thread() {  
      
      @Override
      public void run() {
          Drawable drawable = fetchDrawable(urlString);
          if (drawable != null) {
              Message message = handler.obtainMessage(1, drawable);
              handler.sendMessage(message);
          }
      }};
      thread.start();
      

      如果重用当前线程的视图(如前所述),也可以取消当前线程,但我决定不这样做,因为我想填充缓存以供以后重用。

      如果处理方式错误,则可以看到多行重复出现的文本。我最近在博客上写了一点关于它的内容——见。除此之外,你可能想看看。一般来说,这是因为视图重用,我已经见过几次了。

      只有一个提示:永远不要使用项目布局的透明背景-这会大大降低性能

      对不起,但我使用newView()、bindView()来显示数据。这是同样的问题吗?我想我发现一些有用的视频,谢谢分享!