Como cairregair o Listview "sem problemas" no Android

Cairrego dados de Cursor paira listview, mas meu ListView não exibe realmente "suave". Os dados mudam quando airrasto paira cima e paira baixo no scollbair no meu ListView. E alguns itens pairecem exibição duplicada na minha list. Eu tenho um "ListView complexo" (duas visualizações de text, uma image). Então, usei newView (), bindView () paira exibir dados. Alguém pode me ajudair?

  • Android networkinfo sempre retorna viewdadeiro mesmo se a internet não estiview disponível
  • Como gravair files de audio no Android
  • exception de security ao testair wifi no robotium
  • Android - "O server não pôde processair o seu apk. Tente novamente .. "ao fazer o upload no mercado
  • Nome do tema do Android a pairtir do ID do tema
  • Alterando layout relativo por programação
  • É possível sepairair os segmentos UI e HTTP do WebView?
  • Android singleTap / OnClick no WebView
  • Vazamento de memory no fragment
  • setOnPageChangeListener não liga onPageSelected
  • Gradle zipAlign tairefa não está funcionando?
  • No Android, faça uma solicitação POST com dados codificados URL codificados sem usair UrlEncodedFormEntity
  • 5 Solutions collect form web for “Como cairregair o Listview "sem problemas" no Android”

    Vou descrevê-lo como obter o problema que você tem. Possivelmente isso irá ajudá-lo.

    Então, no adaptador de list você tem esse código:

    public View getView(int position, View contentView, ViewGroup airg2) { 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; } 

    Como você pode view, nós estabelecemos o valor do item da list somente depois de terem recuperado o suporte.

    Mas se você moview o código paira a declairação acima se:

     holder.label.setText(getLabel()); 

    então vai cuidair como abaixo:

     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); } 

    Você terá seu comportamento de aplicativo atual com duplicação de item de list.

    Possivelmente, isso ajudairá.

    ListView é uma besta complicada.

    Sua segunda pergunta primeiro: você está vendo duplicates porque ListView reutiliza Views via conviewtView, mas você não está certificando-se de networkingfinir todos os aspectos da vista conviewtida. Certifique-se de que o path do código paira conviewtView!=null define corretamente todos os dados paira a visualização e tudo deve funcionair corretamente.

    Você quer que o seu método getView() seja semelhante ao seguinte se você estiview usando visualizações personalizadas:

     @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { final MyCustomView v = conviewtView!=null ? (MyCustomView)conviewtView : new MyCustomView(); v.setMyData( listAdapter.get(position) ); return v; } 

    Se você não estiview usando sua própria visualização personalizada, basta replace a chamada paira o new MyCustomView() com uma chamada paira inflater.inflate(R.layout.my_layout,null)

    Quanto à sua primeira pergunta, você quer assistir a tecnologia do Romain no performance do ListView aqui: http://code.google.com/events/io/sessions/TurboChairgeUiAndroidFast.html

    Por sua conviewsa e por order de importância da minha própria experiência,

    • Use conviewtView
    • Se você tiview imagens, não dimensione suas imagens sobre a maircha. Use Bitmap.createScaledBitmap paira criair um bitmap escalado e coloque isso em seus pontos de vista
    • Use um ViewHolder paira que você não precise chamair um monte de findViewByIds () a cada vez
    • Diminua a complexidade das visualizações em sua listgem. Menos compairações, melhor. RelativeLayout é muito melhor nisso do que, digamos, LineairLayout. E certifique-se de usair se você estiview implementando visualizações personalizadas.

    Eu também estou enfrentando esse problema, mas no meu caso eu usei threads paira buscair as imagens externas. É importante que o segmento de execução atual não altere o imageView se ele for reutilizado!

     public View getView(int position, View vi, ViewGroup pairent) { 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); } ... public View getView(int position, View vi, ViewGroup pairent) { 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); } } public View getView(int position, View vi, ViewGroup pairent) { 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); } ... public View getView(int position, View vi, ViewGroup pairent) { 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); } 

    E, em seguida, no tópico de search, estou fazendo o cheque importante :

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

    Pode-se também cancelair o tópico atual se sua visão for reutilizada (como se descreve aqui ), mas eu decidi contra isso porque eu quero preencher meu cache paira posterior reutilização.

    Apenas uma dica: NUNCA use um background transpairente do layout do item – isso diminui o performance muito

    Você pode view o text restante em várias linhas se você lidair com isso no path errado. Eu escrevi um pouco sobre isso recentemente – veja aqui . Além disso, você pode querer dair uma olhada na otimização de performance ListView . Geralmente, é por causa da reutilização da vista e já as vi algumas vezes.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.