2017-02-17 1 views
1

Ich wende eigene Logik auf ein einzelnes Element in Recyclerview an. wenn i Element auswählen und letzte Position bewegen und neues Element auswählen und Hintergrund entfernen zuletzt ausgewähltes Element zeigt dann FehlerRecyclerview selected view null on Scroll

java.lang.NullPointerException: Der Versuch von Feld zu lesen ‚android.view.View android.support.v7 .widget.RecyclerView $ ViewHolder.itemView‘auf ein null-Objekt Referenz

Meine Logik ist:

recyclerView.addOnItemTouchListener(
       new RecyclerItemClickListener(SubServicesActivity.this, recyclerViewSubServices ,new RecyclerItemClickListener.OnItemClickListener() { 
        @Override public void onItemClick(View view, int position) { 

         String selectedName = serviceLists.get(position).getServiceTitleEnglish(); 

         RecyclerView.ViewHolder viewHolder = recyclerViewSubServices.findViewHolderForPosition(position); 
         FrameLayout serviceImageBackground = (FrameLayout) viewHolder.itemView.findViewById(R.id.image_back_layout); 

         if(!select) { 
          serviceImageBackground.setBackground(getResources().getDrawable(R.drawable.selection_border_tick_rec)); 
          select = true; 
          selectedPosition = position; 
         }else{ 

          RecyclerView.ViewHolder viewHolderselect = recyclerViewSubServices.findViewHolderForPosition(selectedPosition); 
           FrameLayout serviceImageSelect = (FrameLayout) viewHolderselect.itemView.findViewById(R.id.image_back_layout); 
           serviceImageSelect.setBackgroundColor(getResources().getColor(R.color.material_grey_200)); 
           serviceImageBackground.setBackground(getResources().getDrawable(R.drawable.selection_border_tick_rec)); 
           selectedPosition = position;       
         } 
        } 

        @Override public void onLongItemClick(View view, int position) { 
         // do whatever 
        } 
       }) 
     ); 

Adapter Klasse:

public class SubServicesAdapter extends RecyclerView.Adapter<SubServicesAdapter.ServiceViewHolder> { 


    List<ServiceList> subServiceModels; 
    Context context; 

    public class ServiceViewHolder extends RecyclerView.ViewHolder{ 

     TextView textViewSubServiceName; 
     ImageView imageViewSubServiceIcon; 
     FrameLayout imageBacklayout; 
     CheckBox selectSubServiceCheckBox; 

     public ServiceViewHolder(View itemView) { 
      super(itemView); 
      this.textViewSubServiceName = (TextView) itemView.findViewById(R.id.sub_service_title_textview); 
      this.imageViewSubServiceIcon = (ImageView) itemView.findViewById(R.id.sub_service_icon_imageview); 
      this.imageBacklayout = (FrameLayout) itemView.findViewById(R.id.image_back_layout); 
      this.selectSubServiceCheckBox = (CheckBox) itemView.findViewById(R.id.select_sub_service_checkbox); 


     } 
} 

    public SubServicesAdapter(Context _context, List<ServiceList> _subServiceModels) { 
     this.subServiceModels = _subServiceModels; 
     this.context = _context; 

    } 

    @Override 
    public ServiceViewHolder onCreateViewHolder(ViewGroup parent, 
              int viewType) { 
     View view = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.sub_service_card_layout, parent, false); 

     ServiceViewHolder myViewHolder = new ServiceViewHolder(view); 
     return myViewHolder; 
    } 

    @Override 
    public void onBindViewHolder(ServiceViewHolder holder, int position) { 

     final ServiceList serviceItem = subServiceModels.get(position); 

     TextView textViewSubServiceName = holder.textViewSubServiceName; 
     ImageView imageViewSubServiceIcon = holder.imageViewSubServiceIcon; 
     FrameLayout imageBackground = holder.imageBacklayout; 
     final CheckBox checkBox = holder.selectSubServiceCheckBox; 

     textViewSubServiceName.setText(subServiceModels.get(position).getServiceTitleEnglish()); 
     Picasso.with(context) 
       .load(subServiceModels.get(position).getImageURL()) 
       .resize(150, 150) 
       .centerCrop() 
       .into(imageViewSubServiceIcon); 
     // imageViewSubServiceIcon.setImageResource(icons[position]); 
    } 

    @Override 
    public int getItemCount() { 
     return subServiceModels.size(); 
    } 
} 
+0

'viewHolder' ist null. – Divers

+0

poste deinen Adaptercode –

+0

@an_droid_dev Ich poste Adapterklasse überprüfe es. – Nabeel

Antwort

0

Ich habe auch das gleiche Problem, das ich auf folgende Weise gelöst wurde. Ich habe gerade die Modellklasse zur Pflege der ausgewählten Werte erstellt. Wenn wir also "onBindViewHolder" scrollen, werden wir einfach die ausgewählte Position überprüfen und den Hintergrund einstellen.

Das Problem ist Recyclerview Wiederverwendung der Viewholder und wenn es nicht die Ansicht festgelegt ist, dann gibt es die Null zurück.

public void onBindViewHolder(ViewHolder holder, int position) { 



       File file =new File(imageUrlList.get(position)); 
       View v=null; 
       if(file.length()>0){ 
        Glide.with(mContext).load(imageUrlList.get(position)).into(holder.imageView); 

        holder.imagePath=imageUrlList.get(position); 
        // Get the Selected Item from model class and set the background. 
    **ArrayList<Integer>selectedImages=GalleryHelper.getInstance().getSelectedImagePositions(); 

        if(selectedImages!=null && selectedImages.contains(position)){ 

         Drawable highlight=mContext.getResources().getDrawable(R.drawable.image_border); 
         v= holder.itemView; 

         v.setBackground(highlight); 
        }else { 
         v= holder.itemView; 
         v.setBackground(null); 
        } 

       }else{ 
        Log.i(TAG," This file is Empty : "+imageUrlList.get(position)); 
       }** 





      }