Mais um getView chamado várias vezes

Cada item no meu ListView contém um ImageView e um TextView , este será preenchido com informações remotas.

Recebi uma URL paira o ImageView , por isso, eu começo um AsyncTask que baixa a image e chamairá setImageBitmap com o bitmap baixado.

  • Android - Cairregando, aguairde por favor
  • Como adicionair events do calendar ao calendar padrão, silenciosamente sem Intenção, no Android 4?
  • Ocultair text padrão paira o button do button Android
  • Intel HAXM 6.0.4 não compatível com MacOS
  • Passe uma matriz de Mats paira o código nativo
  • Android: não é possível criair instâncias de atividade / ClassNotFoundException
  • Isso vai muito bem, mas quando o ListView é criado, o getView() é chamado frequentemente. Ele chama cerca de 7 vezes o getView paira as 10 primeiras linhas (apenas 7 visíveis). (Então: 0, 1, etc, 10, 0, 1, etc.).

    Então eu posso deslizair facilmente paira o 10º item. Mas depois disso, paira cada nova linha, o listview liga novamente cerca de 7 vezes o getView paira os 10 primeiros itens. (Isso causairá atraso …)

    Mas quando eu remoview o setImageBitmap do AsyncTask , isso não acontecerá!

    Qual poderia ser o problema? Pode ser que algum layout seja grande, o que causairá outra série de getViews?

    Aqui, algum código:

     <ListView android:id="@+id/mylist" android:layout_width="wrap_content" android:layout_height="fill_pairent" android:layout_alignPairentBottom="true" android:layout_below="@+id/mydivider" android:divider="@+color/mycolor" android:dividerHeight="2dp" android:fadingEdge="none" android:fastScrollEnabled="true" android:listSelector="@android:color/transpairent" android:scrollbairs="horizontal" android:scrollingCache="false" android:smoothScrollbair="false" /> android: layout_width = "wrap_content" <ListView android:id="@+id/mylist" android:layout_width="wrap_content" android:layout_height="fill_pairent" android:layout_alignPairentBottom="true" android:layout_below="@+id/mydivider" android:divider="@+color/mycolor" android:dividerHeight="2dp" android:fadingEdge="none" android:fastScrollEnabled="true" android:listSelector="@android:color/transpairent" android:scrollbairs="horizontal" android:scrollingCache="false" android:smoothScrollbair="false" /> 

    The AsyncTask:

     public static class MyTask extends AsyncTask<String, Integer, Bitmap> { private LruCache<String, Bitmap> mMap; private String mUri; private int mPosition; private ViewHolder mHolder; public MyTask (ViewHolder holder, int position, LruCache<String, Bitmap> map) { mMap = map; mHolder = holder; mPosition = position; } @Oviewride protected Bitmap doInBackground(String... url) { mUri = url[0]; return getBitmapFromURL(mUri); } @Oviewride protected void onPostExecute(Bitmap b) { if (b != null) { mMap.put(mUri, b); if (mPosition == mHolder.position) { holder.image.setImageBitmap(b); } } }; } } public static class MyTask extends AsyncTask<String, Integer, Bitmap> { private LruCache<String, Bitmap> mMap; private String mUri; private int mPosition; private ViewHolder mHolder; public MyTask (ViewHolder holder, int position, LruCache<String, Bitmap> map) { mMap = map; mHolder = holder; mPosition = position; } @Oviewride protected Bitmap doInBackground(String... url) { mUri = url[0]; return getBitmapFromURL(mUri); } @Oviewride protected void onPostExecute(Bitmap b) { if (b != null) { mMap.put(mUri, b); if (mPosition == mHolder.position) { holder.image.setImageBitmap(b); } } }; } } public static class MyTask extends AsyncTask<String, Integer, Bitmap> { private LruCache<String, Bitmap> mMap; private String mUri; private int mPosition; private ViewHolder mHolder; public MyTask (ViewHolder holder, int position, LruCache<String, Bitmap> map) { mMap = map; mHolder = holder; mPosition = position; } @Oviewride protected Bitmap doInBackground(String... url) { mUri = url[0]; return getBitmapFromURL(mUri); } @Oviewride protected void onPostExecute(Bitmap b) { if (b != null) { mMap.put(mUri, b); if (mPosition == mHolder.position) { holder.image.setImageBitmap(b); } } }; } } public static class MyTask extends AsyncTask<String, Integer, Bitmap> { private LruCache<String, Bitmap> mMap; private String mUri; private int mPosition; private ViewHolder mHolder; public MyTask (ViewHolder holder, int position, LruCache<String, Bitmap> map) { mMap = map; mHolder = holder; mPosition = position; } @Oviewride protected Bitmap doInBackground(String... url) { mUri = url[0]; return getBitmapFromURL(mUri); } @Oviewride protected void onPostExecute(Bitmap b) { if (b != null) { mMap.put(mUri, b); if (mPosition == mHolder.position) { holder.image.setImageBitmap(b); } } }; } } public static class MyTask extends AsyncTask<String, Integer, Bitmap> { private LruCache<String, Bitmap> mMap; private String mUri; private int mPosition; private ViewHolder mHolder; public MyTask (ViewHolder holder, int position, LruCache<String, Bitmap> map) { mMap = map; mHolder = holder; mPosition = position; } @Oviewride protected Bitmap doInBackground(String... url) { mUri = url[0]; return getBitmapFromURL(mUri); } @Oviewride protected void onPostExecute(Bitmap b) { if (b != null) { mMap.put(mUri, b); if (mPosition == mHolder.position) { holder.image.setImageBitmap(b); } } }; } }; public static class MyTask extends AsyncTask<String, Integer, Bitmap> { private LruCache<String, Bitmap> mMap; private String mUri; private int mPosition; private ViewHolder mHolder; public MyTask (ViewHolder holder, int position, LruCache<String, Bitmap> map) { mMap = map; mHolder = holder; mPosition = position; } @Oviewride protected Bitmap doInBackground(String... url) { mUri = url[0]; return getBitmapFromURL(mUri); } @Oviewride protected void onPostExecute(Bitmap b) { if (b != null) { mMap.put(mUri, b); if (mPosition == mHolder.position) { holder.image.setImageBitmap(b); } } }; } 

    getView ()

     row = conviewtView; ViewHolder holder; if (row == null) { row = vi.inflate(R.layout.mylayout, null); holder = new ViewHolder(); holder.image = (ImageView) row.findViewById(R.id.myimage); holder.title = (TextView) row.findViewById(R.id.mytext); row.setTag(holder); } else { holder = (ViewHolder) row.getTag(); } holder.title.setText("text"); holder.image.setImageResource(R.drawable.mydefaulticon); holder.position = position; stairtMyTask(content, holder, position); } row = conviewtView; ViewHolder holder; if (row == null) { row = vi.inflate(R.layout.mylayout, null); holder = new ViewHolder(); holder.image = (ImageView) row.findViewById(R.id.myimage); holder.title = (TextView) row.findViewById(R.id.mytext); row.setTag(holder); } else { holder = (ViewHolder) row.getTag(); } holder.title.setText("text"); holder.image.setImageResource(R.drawable.mydefaulticon); holder.position = position; stairtMyTask(content, holder, position); 

    Mais informações:

    Quando uma nova visualização é criada, o stacktrace mostrou que o getView foi chamado de ListView.makeAndAddView() Mas, na série inútil de getViews, ele vem de ListView.measureHeigthOfChildren()

    Então, pairece que o layout foi alterado quando eu definir o Bitmap …

  • Como colocair o text de forma desenhável?
  • Como personalizair o CirclePageIndicator?
  • ActivityManager: Exceção lançada ao iniciair atividades java.lang.IllegalArgumentException: val.length> 91
  • Paire de rolair em CollapsingToolbairLayout paira que ele não colapse completamente
  • android.os.FileUriExposedException: file.jpg exposto além do aplicativo através de ClipData.Item.getUri ()
  • Como rotei o emulador de Android do código de teste?
  • 5 Solutions collect form web for “Mais um getView chamado várias vezes”

    O problema estava no Layout do ListView.

    O pairâmetro layout_width foi configurado paira wrap_content quando eu mudei paira fill_pairent o problema desapaireceu …

    Eu recomendo que você assista este vídeo http://www.youtube.com/watch?v=wDBM6wVEO70

    basicamente, o Android irá chamair getView várias vezes paira o cálculo de alturas de exibição e coisas, então você precisa implementair algum tipo de cache no seu async, viewifique http://code.google.com/p/android-query/ que tenha isso se você não usa authentication

    O problema é que seu ListView não sabe qual é o item de cada item. Ao inicializair, o ListView irá medir todos os seus filhos e desenhair-se sobre esta informação. O que você está fazendo com o seu AsyncTask, está mudando os tamanhos dos itens na list e não deixando que o ListView se desenhe novamente completamente. Isso resulta em seu ListView paira se comportair estranhamente.

    Solução: você deve atualizair seu ListView notificando o Adaptador usando notifyDataSetChanged () no PostExecute do seu AssyncTask. Isso permitirá que o ListView se desenhe com as novas informações.

    Eu espero que dê certo !

    Alguns links úteis:

    http://thinkandroid.wordpress.com/2012/06/13/lazy-loading-images-from-urls-to-listviews/

    Cairga preguiçosa de imagens em ListView

    Desculpe a resposta tairdia. Eu estava enfrentando o mesmo problema no meu adaptador paira o widget da galeria. Eu tinha empregado o Univiewsal Image Loader. A solução de Mairtijn funcionou paira mim. O que tudo o que eu tinha a fazer era adicionair notifyDataSetChanged () quando a image tinha sido completamente baixada e o imageView estava sendo configurado.

    Eu tentei usair fill_pairent como altura no ListView, mas não consegui alcançá-lo perfeito, mas, como nunca, eu tentei impedindo a criação de ConviewtViews se já existe. Isso funciona bem no meu appoach.

      @Oviewride public View getView(final int position, View conviewtView, ViewGroup pairent) { if (conviewtView != null) return conviewtView; else { //your code... } } }  @Oviewride public View getView(final int position, View conviewtView, ViewGroup pairent) { if (conviewtView != null) return conviewtView; else { //your code... } } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.