2016-11-12 13 views
0

私はRecClickerViewも持っていますが、onClickListenerを添付したいのですが、項目をクリックするとnullオブジェクトエラーが発生します。私のonclicklistenerが正しく接続されていないようですね?RecyclerView onClickListenerとViewType

別の問題もあります。正しいビューホールダーが返されないようですか?

EDITは:viewHolderとビューの変数の問題のいくつかの並べ替えているように見えるが、わからない使用してどのような....クリックリスナーとして

 @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 

     // Variable to hold the view and view holder. 
     View view = null; 
     RecyclerView.ViewHolder viewHolder = null; 

     // Choose which field type to display. 
     switch (viewType) { 
      case TEMPLATE_DETAILS_FIELD: 
       view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.templates_add_template_details_field, viewGroup, false); 
       viewHolder = new TemplateDetailsField(view); 
      case SECTION_FIELD: 
       view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.templates_add_section_field, viewGroup, false); 
       viewHolder = new SectionField(view); 
      case HEADING_FIELD: 
       // Create the new view. 
       view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.templates_add_heading_field, viewGroup, false); 

       // Create a new heading field. 
       HeadingField headingField = new HeadingField(view); 

       // Attach the edittext listener to it. 
       headingField.getHeading().addTextChangedListener(new TitleTextWatcher(headingField.getTitle(), headingField.getHeading())); 
       viewHolder = headingField; 
      default: 
       // Do nothing here. 
       break; 
     } 

     //Create a temp view holder for the onclick listener. 
     final RecyclerView.ViewHolder tempViewHolder = viewHolder; 

     // Set the onclick listener to expand and contract the view. 
     view.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 
       FrameLayout expandedView = (FrameLayout) view.findViewById(R.id.expanded_view); 
       // Check if the child view is visible or not. 
       if (expandedView.getVisibility() == View.VISIBLE) { 

        // View is visible, hide the view. 
        expandedView.setVisibility(View.GONE); 

        // Add to expanded state array list. 
        mRecyclerViewExpandedState.set(tempViewHolder.getAdapterPosition(), false); 
       } else { 

        // View is not visible, show the view. 
        expandedView.setVisibility(View.VISIBLE); 

        // Add to expanded state array list. 
        mRecyclerViewExpandedState.set(tempViewHolder.getAdapterPosition(), true); 
       } 
      } 
     }); 

     return viewHolder; 
    } 
+0

あなたが好き試すことができます。viewHolder.itemView.setOnClickListener(); そして、tempViewHolderをユーザーにする必要はありません。 – Harry

+0

次のエラーが表示されます。 viewHolderはライン上でnullポインタ例外を生成することがあります。viewHolder.itemView.setOnClickListener(new View.OnClickListener(){ – user1406186

+0

私が間違っていないかどうか警告します。デフォルトではviewHolderを初期化してください。 – Harry

答えて

0

使用これを、

import android.content.Context; 
import android.support.v7.widget.RecyclerView; 
import android.view.GestureDetector; 
import android.view.MotionEvent; 
import android.view.View; 

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener { 
private OnItemClickListener mListener; 

public interface OnItemClickListener { 
    public void onItemClick(View view, int position); 
} 

GestureDetector mGestureDetector; 

public RecyclerItemClickListener(Context context, OnItemClickListener listener) { 
    mListener = listener; 
    mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { 
     @Override 
     public boolean onSingleTapUp(MotionEvent e) { 
      return true; 
     } 
    }); 
} 

@Override 
public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) { 
    View childView = view.findChildViewUnder(e.getX(), e.getY()); 
    if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) { 
     mListener.onItemClick(childView, view.getChildAdapterPosition(childView)); 
    } 
    return false; 
} 

@Override 
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { 
    } 
} 

それは非常に簡単です。ただ、RecyclerViewに、このクラスの項目のタッチリスナーを追加します。

recyclerView.addOnItemTouchListener( 
    new RecyclerItemClickListener(context, new RecyclerItemClickListener.OnItemClickListener() { 
    @Override public void onItemClick(View view, int position) { 
    // TODO Handle item click 
    } 
}) 
); 
関連する問題