2015-06-19 104 views
-1

我尝试通过单击它们来更改ImageView的背景,但它不起作用。 我有这在我的ViewHolderAndroid - RecyclerView onClick不起作用

我得到

尝试在空对象erference调用虚方法 ..StreamViewHolder.getAdapterPosition()

import java.util.List; 

import de.caglar.aqua.R; 
import de.caglar.aqua.objects.StreamObject; 
import de.caglar.aqua.views.CircularImageView; 
import android.support.v7.widget.CardView; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class StreamAdapter extends RecyclerView.Adapter<StreamAdapter.StreamViewHolder> implements View.OnClickListener { 

    public static List<StreamObject> streams; 

    public StreamAdapter(List<StreamObject> s){ 
     streams = s; 
    } 

    public static class StreamViewHolder extends RecyclerView.ViewHolder {  
     CardView cardView; 
     public TextView streamTitle; 
     public TextView streamText; 
     public TextView streamDescription; 
     public CircularImageView streamPhoto; 
     public ImageView streamLike; 

     public StreamViewHolder(View itemView) { 
      super(itemView); 
      cardView = (CardView) itemView.findViewById(R.id.stream_cardview); 
      streamTitle = (TextView) itemView.findViewById(R.id.stream_title); 
      streamText = (TextView) itemView.findViewById(R.id.stream_text); 
      streamDescription = (TextView) itemView.findViewById(R.id.stream_description); 
      streamPhoto = (CircularImageView) itemView.findViewById(R.id.stream_photo); 
      streamLike = (ImageView) itemView.findViewById(R.id.stream_like); 
     } 
    } 

    @Override 
    public int getItemCount() { 
     return streams.size(); 
    } 

    @Override 
    public void onBindViewHolder(StreamViewHolder streamViewHolder, int i) { 
     streamViewHolder.streamTitle.setText(streams.get(i).title); 
     streamViewHolder.streamText.setText(streams.get(i).text); 
     streamViewHolder.streamDescription.setText(streams.get(i).description); 
     streamViewHolder.streamPhoto.setBackground(streams.get(i).photo); 
     if(streams.get(i).isLiked) { 
      streamViewHolder.streamLike.setImageResource(R.drawable.ic_action_like_active); 
     } else { 
      streamViewHolder.streamLike.setImageResource(R.drawable.ic_action_like); 
     } 
     streamViewHolder.streamLike.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     try { 
      if (v instanceof ImageView) { 
       StreamViewHolder holder = (StreamViewHolder) v.getTag(); 
       int position = holder.getAdapterPosition(); 
       if(streams.get(position).isLiked) { 
        streams.get(position).isLiked = false; 
        holder.streamLike.setImageResource(R.drawable.ic_action_like); 
       } else { 
        streams.get(position).isLiked = true; 
        holder.streamLike.setImageResource(R.drawable.ic_action_like_active); 
       } 
      } 
     } catch (Exception e) { 
      Toast.makeText(v.getContext(), e.getMessage().toString(), Toast.LENGTH_LONG).show(); 
     } 
    } 

    @Override 
    public StreamViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.cardview_stream, viewGroup, false); 
     StreamViewHolder pvh = new StreamViewHolder(v); 
     return pvh; 
    } 

    @Override 
    public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
     super.onAttachedToRecyclerView(recyclerView); 
    } 
} 
+0

你能发布完整的代码吗? –

+0

这很难找到问题。您是否尝试添加一些日志记录以查看是否执行正确的分支?或者'streams.get(position)'实际返回正确的对象? – SqueezyMo

+0

我编辑了我的帖子 –

回答

0

在将这个您的onBindViewHolder方法

streamViewHolder.streamLike.setTag(streamViewHolder) 
+0

omg谢谢它的工作! –