2016-09-22 2 views
1

Это первый раз, когда я работаю с RecyclerView, я сделал класс Adapter с некоторыми статистическими данными.События прикосновений Recyclerview

public static class ViewHolder extends RecyclerView.ViewHolder{ 

     public TextView textView; 

     public ViewHolder(View view){ 

      super(view); 

      textView = (TextView)view.findViewById(R.id.MyTextView); 
     } 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     view1 = LayoutInflater.from(context).inflate(R.layout.item, parent ,false); 

     Toast.makeText(context, "@@@@@@@@@@@@" +viewType, Toast.LENGTH_SHORT).show(); 

     viewHolder1 = new ViewHolder(view1); 

     return viewHolder1; 
    } 

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

     holder.textView.setText(SubjectValues[position]); 
    } 

    @Override 
    public int getItemCount() { 
     return SubjectValues.length; 
    } 
} 

это мой Adapter CLAS теперь он показывает фиктивный данные, которые я хочу достичь событие щелчка.

+0

Ваши данные отображаются правильно? Где вы установили адаптер, пожалуйста, поделитесь этим кодом? –

+0

как начинающий лучше попробовать некоторые учебные пособия, http: //www.androidhive.info/2016/01/android-working-with-recycler-view/ – darwin

ответ

0

Чтобы добавить событие нажмите добавить следующий код в метод onBindViewHolder:

holder.textView.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 
        int adapterPos = holder.getAdapterPosition(); 
        if(adapterPos != RecyclerView.NO_POSITION) { 
         Toast.makeText(context, SubjectValues[adapterPos], Toast.LENGTH_SHORT).show(); 
        } 
      } 
     }); 

Это добавит щелчок слушателя к TextView, который показывает тост значения.
Примечание: Я сделал предположения о том, что является вашим объектом SubjectValues, как не включено в ваш вопрос.

Но важные вещи, чтобы наблюдать здесь:

  • holder.getAdapterPosition()
  • Проверьте положение (= RecyclerView.NO_POSITION!)
  • Установите в onBindViewHolder

I верьте, что это справедливое резюме того, как установить прослушиватель кликов в адаптере recyclerview.

+0

Спасибо, что это сработало, но нужно что-то сказать, зачем нам нужно позиция, если уже есть позиция в 'onBindViewHolder (держатель ViewHolder, конечная позиция int)' –

+0

В некоторых случаях позиция в '' 'onBindViewHolder'' будет работать, но я не думаю, что это правильный путь , Поскольку позиции позиций в вашем адаптере могут измениться после того, как вы установили прослушиватель кликов, либо потому, что они были удалены или перемещены (обычно это взаимодействие с пользователем). В любом случае, я настоятельно рекомендую использовать '' 'holder.getAdapterPosition()' '', поскольку он дает лучшее, более надежное решение для будущего. Конечно, из моего опыта это может означать гораздо меньше времени на погоню за ошибкой, которая не сразу очевидна. –

0

добавить этот класс в проект

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 true; 
    } 
    return false; 
} 

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

@Override 
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 
} 

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

затем в вашем использовании RecyclerView это

myRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() { 
     @Override 
     public void onItemClick(View view, int position) { 
      YourModel model = modelList.get(position); 
     } 
    })); 
0

Добавить OnItemClickListener интерфейс в адаптере.

OnItemClickListener mItemClickListener; 

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

public void setOnItemClickListener(
     final OnItemClickListener mItemClickListener) { 
    this.mItemClickListener = mItemClickListener; 
} 

Реализует OnItemClickListener на ViewHolder, как показано ниже.

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

    public TextView textView; 

    public ViewHolder(View view){ 
     super(view); 
     textView = (TextView)view.findViewById(R.id.MyTextView); 
     view.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     if (mItemClickListener != null) { 
      mItemClickListener.onItemClick(v, getAdapterPosition()); 
     } 
    }  
} 

В вашей деятельности или фрагменте setOnItemClickListener на вашем адаптере.

mAdapter.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(View view, int position) { 
      // Do your stuff here when item clicked 
     } 
    }); 
1

Внутри вашего onBindViewHolder набор OnClickListener

@Override 
    public void onBindViewHolder(final HomeListAdapter.MainViewHolder homeViewHolder, final int position) { 

     homeViewHolder.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(this, "Item no: "+ position, LENGTH_SHORT).show; 
      } 
     }); 
} 

Используя этот способ будет сделать позиции макета кликабельны не только TextView или кнопку. Если вы хотите активировать действие при нажатии кнопки или текстового поля, вы можете использовать ссылку на эти компоненты, например. держатель.button.setOnClickListener (новый OnClick ..) ......

2

В классе адаптера, метод внутри onBindViewHolder(), вы можете зарегистрировать слушатель ко всей строке в следующем виде:

vh1.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // Toast.makeText(ComplexRecyclerViewAdapter.this, "Item no: "+ position, Toast.LENGTH_LONG).show; 
       Toast.makeText(v.getContext(), "General click !", Toast.LENGTH_SHORT).show(); 
      } 
     }); 

Если вы хотите зарегистрировать слушатель на определенный вид внутри макета строки, вы можете сделать это в следующем виде:

vh1.getButton().setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // Toast.makeText(ComplexRecyclerViewAdapter.this, "Item no: "+ position, Toast.LENGTH_LONG).show; 
     Toast.makeText(v.getContext(), "Button is clicked ! ", Toast.LENGTH_SHORT).show(); 
    } 
}); 

весь исходный код для класса адаптера:

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { 
    switch (viewHolder.getItemViewType()) { 
     case USER: 
      ViewHolder1 vh1 = (ViewHolder1) viewHolder; 
      configureViewHolder1(vh1, position); 
      break; 
    } 
} 

private void configureViewHolder1(ViewHolder1 vh1, int position) { 
    User user = (User) items.get(position); 
    if (user != null) { 
     vh1.getLabel1().setText("Name: " + user.name); 
     vh1.getLabel2().setText("Hometown: " + user.hometown); 

     vh1.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // Toast.makeText(ComplexRecyclerViewAdapter.this, "Item no: "+ position, Toast.LENGTH_LONG).show; 
       Toast.makeText(v.getContext(), "General click !", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     vh1.getButton().setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // Toast.makeText(ComplexRecyclerViewAdapter.this, "Item no: "+ position, Toast.LENGTH_LONG).show; 
       Toast.makeText(v.getContext(), "Button is clicked ! ", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 
} 

ViewHolder1.java

public class ViewHolder1 extends RecyclerView.ViewHolder { 

    private TextView label1, label2; 

    private Button button; 

    public ViewHolder1(View v) { 
     super(v); 
     ... 
     button = (Button) v.findViewById(R.id.button); 
    } 

    public Button getButton() { 
     return button; 
    } 

    public void setButton(Button button) { 
     this.button = button; 
    } 
}