2017-03-14 7 views
0

したがって、私はrecyclerviewの別の行をクリックするときにアクティビティを開始する必要があります。私はちょうど私がこのコード を試みたが、recyclerviewの各行で異なるクラスを開く方法

class MyViewholder extends RecyclerView.ViewHolder implements View.OnClickListener{ 
    private final Context context; 

public MyViewholder(View itemView) { 
    super(itemView); 
    context = itemView.getContext(); 
} 

@Override 
public void onClick(View view) { 
    final Intent intent; 
    switch (getAdapterPosition()){ 
     case 0: 
      intent = new Intent(context, CalendarControllerFrancisco.class); 
      break; 

     case 1: 
      intent = new Intent(context, CalendarControllerB.class); 
      break; 

     case 2: 
      intent = new Intent(context, CalendarControllerNa.class); 
      break; 

     default: 
      intent = new Intent(context, CalendarController.class); 
      break; 
    } 
    context.startActivity(intent); 

パブリッククラスLocationAdapterあなたは一つの成分のためsetOnClickListenerイベントを追加必要RecyclerView.Adapter {

private ArrayList<LocationModel> dataSet; 
Boolean check = false; 
public class MyViewHolder extends RecyclerView.ViewHolder { 
//private final Context context; 
    TextView locat; 


    public MyViewHolder(View itemView) { 
     super(itemView); 
     // context = itemView.getContext(); 
     this.locat = (TextView)itemView.findViewById(R.id.wordtext); 
    } 
} 


public LocationAdapter(ArrayList<LocationModel> data) { 
    this.dataSet = data; 
} 


@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.card_view_row,parent,false); 
    MyViewHolder myViewHolder = new MyViewHolder(view); 
    return myViewHolder; 
} 

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

    TextView word1 = holder.locat; 
    word1.setText(dataSet.get(position).getLocations()); 
} 

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

あなたのロジックは違うのですか? – MadScientist

答えて

0

を拡張して動作していないしているように見える方法を見つけ出す傾けます。

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

    TextView word1 = holder.locat; 
    word1.setText(dataSet.get(position).getLocations()); 
    word.setOnClickListener(holder); 
} 
0

RecyclerItemClickListener

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

@Override 
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 
} 
} 

のListView onItemClickListenerと同じようClickListenerを定義

recyclerView.addOnItemTouchListener( 
    new RecyclerItemClickListener(context, new RecyclerItemClickListener.OnItemClickListener() { 
    @Override public void onItemClick(View view, int position) { 
    // TODO Handle item click 
    } 
}) 
); 
+0

これはどういう意味ですか?このクラスRecyclerItemClickListenerを作成する必要がありますか? 、もしそうでなければ、私はそれを置くだろう。残念ながら私にはこれが初めてです。 –

0

これは間違っている:

@Override 
public void onClick(View view) { 
    final Intent intent; 
    switch (getAdapterPosition()){ 
     case 0: 
      intent = new Intent(context, CalendarControllerFrancisco.class); 
      break; 

     case 1: 
      intent = new Intent(context, CalendarControllerB.class); 
      break; 

     case 2: 
      intent = new Intent(context, CalendarControllerNa.class); 
      break; 

     default: 
      intent = new Intent(context, CalendarController.class); 
      break; 
    }} 

ViewHolderは、表示するRecyclerViewアイテムに応じて、アイテムデータを任意に入力するためにアダプタによって使用されるコンテナです。したがって、それ自体を識別するためにアイテムリストからの任意の位置データにアクセスすべきではありません。あなたはコンセプトを混乱させています。アイテムコレクションにアクセスし、すべての項目を作成するためのそのタイプを割り当てるには、コールバックonBindViewHolderお使いのアダプタの使用中に、

その後
class MyViewholder extends RecyclerView.ViewHolder implements View.OnClickListener { 

private final Context context; 
int type; 

public MyViewholder(View itemView) { 
    super(itemView); 
    context = itemView.getContext(); 
} 

public void bind(int type) { 
    this.type = type; 
} 

@Override 
public void onClick(View view) { 
    final Intent intent; 
    switch (this.type){ 
     case 0: 
      intent = new Intent(context, CalendarControllerFrancisco.class); 
      break; 

     case 1: 
      intent = new Intent(context, CalendarControllerB.class); 
      break; 

     case 2: 
      intent = new Intent(context, CalendarControllerNa.class); 
      break; 

     default: 
      intent = new Intent(context, CalendarController.class); 
      break; 
    } 
} 

} 

のようなもので上記を交換してみてください。 次のようなもの:

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

    holder.bind(myItemList.get(position).type()); 

} 
+0

@Override public void onBindViewHolder(MyViewHolder holder、int position){ holder.bind(myItemList.get(position).type()); } –

関連する問題