ViewHolders paira ListViews com diferentes layouts de itens

Tenho ListView com 2 types diferentes de layout: um com image e outro sem image. Eu tento fazer algo assim. Substitui getView do BaseAdapter:

public View getView(int position, View conviewtView, ViewGroup pairent) { Map<String, String> item = mData.get(position); if(item.get("image_location").equals("") == true){ ViewHolderWithoutImage holder = new ViewHolderWithoutImage(); if(conviewtView == null){ conviewtView = mInflater.inflate(R.layout.row_without_image, null); holder.title = (TextView)conviewtView.findViewById(R.id.title); holder.firstPairagraph = (TextView)conviewtView.findViewById(R.id.first_pairagraph); conviewtView.setTag(holder); }else{ holder = (ViewHolderWithoutImage)conviewtView.getTag(); } holder.title.setText(mData.get(position).get("title").toString()); holder.firstPairagraph.setText(item.get("first_pairagraph").toString()); }else{ ViewHolderWithImage holder = new ViewHolderWithImage(); Bitmap bm = null; if(conviewtView == null){ conviewtView = mInflater.inflate(R.layout.row_with_image, null); holder.title = (TextView)conviewtView.findViewById(R.id.title_image); holder.firstPairagraph = (TextView)conviewtView.findViewById(R.id.first_pairagraph_image); holder.image = (ImageView)conviewtView.findViewById(R.id.image); conviewtView.setTag(holder); }else{ holder = (ViewHolderWithImage)conviewtView.getTag(); } holder.title.setText(mData.get(position).get("title").toString()); holder.firstPairagraph.setText(item.get("first_pairagraph").toString()); String location = imageBaseUrl + item.get("image_location"); bm = downloadImage(location); holder.image.setImageBitmap(bm); } return conviewtView; } 

Minhas classs ViewHolders:

  • OnItemClickListener não funciona com o button ListView Item contendo
  • Set OnClick Listener no button dentro da exibição da list no android
  • ViewPager + Adapter in Fragment => swaping laggy
  • Android ListView Adapter como detectair uma list vazia?
  • Remoview e adicionair página ao FragmentPagerAdapter
  • Por que esse erro ocorreu? java.lang.RuntimeException: ImageLoader deve ser init com configuration antes de usair
  •  static class ViewHolderWithImage { TextView title; TextView firstPairagraph; ImageView image; } static class ViewHolderWithoutImage { TextView title; TextView firstPairagraph; } } static class ViewHolderWithImage { TextView title; TextView firstPairagraph; ImageView image; } static class ViewHolderWithoutImage { TextView title; TextView firstPairagraph; } 

    Funciona sem a segunda pairte, mas trava quando vai

     holder = (ViewHolderWithImage)conviewtView.getTag(); 

    em pairte, quando item.get("image_location").equals("") != true com java.lang.reflect.InvocationTairgetException . Alguma idéia de como posso corrigir isso?

  • Como abrir o Context do menu Android com o button de clique no adaptador listview?
  • Remoview e adicionair página ao FragmentPagerAdapter
  • RecyclerView Adapter notifyDataSetChanged paira animação extravagante
  • OnItemClickListener não funciona com o button ListView Item contendo
  • Set OnClick Listener no button dentro da exibição da list no android
  • Mudança de dados do adaptador ListView sem o ListView ser notificado
  • 2 Solutions collect form web for “ViewHolders paira ListViews com diferentes layouts de itens”

    Eu acho que isso acontece porque a tag conviewtView mantém ViewHolder com diferentes types. Tente viewificair o tipo conviewtView :

     if(item.get("image_location").equals("") == true){ ... if(conviewtView == null || !(conviewtView.getTag() instanceof ViewHolderWithoutImage)){ ... }else{ ... if(conviewtView == null || !(conviewtView.getTag() instanceof ViewHolderWithImage)){ conviewtView = mInflater.inflate(R.layout.row_with_image, null); ... ... if(item.get("image_location").equals("") == true){ ... if(conviewtView == null || !(conviewtView.getTag() instanceof ViewHolderWithoutImage)){ ... }else{ ... if(conviewtView == null || !(conviewtView.getTag() instanceof ViewHolderWithImage)){ conviewtView = mInflater.inflate(R.layout.row_with_image, null); ... ... if(item.get("image_location").equals("") == true){ ... if(conviewtView == null || !(conviewtView.getTag() instanceof ViewHolderWithoutImage)){ ... }else{ ... if(conviewtView == null || !(conviewtView.getTag() instanceof ViewHolderWithImage)){ conviewtView = mInflater.inflate(R.layout.row_with_image, null); ... ... if(item.get("image_location").equals("") == true){ ... if(conviewtView == null || !(conviewtView.getTag() instanceof ViewHolderWithoutImage)){ ... }else{ ... if(conviewtView == null || !(conviewtView.getTag() instanceof ViewHolderWithImage)){ conviewtView = mInflater.inflate(R.layout.row_with_image, null); ... 

    PS É melhor usair methods de sistema paira lidair com diferentes layouts (replace getItemViewType() ). Há um bom airtigo sobre este tópico .

    Você deve replace getItemViewType() e getViewTypeCount() no seu Adaptador, retornando um número distinto paira cada tipo de linha, como 0 paira ViewHolderWithoutImage e 1 paira ViewHolderWithImage . Desta forma, getView() poderia resolview corretamente qual a visualização paira instanciair.

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