1

Я следовал this article установить щелчок слушателя на recyclerview, но я смущен от того, что делает следующий интерфейс делает внутри RecyclerItemClickListener класса:Что это за интерфейс делает в этом RecyclerView клик слушателя?

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

Вот полный класс:

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

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener { 

    private OnItemClickListener clickListener; 

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

    GestureDetector gestureDetector; 

    public RecyclerItemClickListener(Context context, OnItemClickListener listener) { 
     clickListener = listener; 
     gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { 

      @Override 
      public boolean onSingleTapUp(MotionEvent e) { 
       return true; 
      } 

     }); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { 

     View childView = rv.findChildViewUnder(e.getX(), e.getY()); 

     if(childView != null && clickListener != null && gestureDetector.onTouchEvent(e)){ 
      clickListener.onItemClick(childView,rv.getChildAdapterPosition(childView)); 
     } 

     return false; 
    } 

    @Override 
    public void onTouchEvent(RecyclerView rv, MotionEvent e) { 
    } 

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

Это, как он используется на активность:

recyclerView.addOnItemTouchListener(
     new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() { 
      @Override 
      public void onItemClick(View view, int position) { 
       Toast.makeText(HomeActivity.this, " " + position, Toast.LENGTH_SHORT).show(); 
      } 
     }) 
); 

Это работает нормально, но я на самом деле хотите знать, что несет ответственность за интерфейс или что он делает. Заранее спасибо!

+0

Ответ перед вами, его обратный вызов для элемента RecyclerView. –

+0

@ deepu513, был бы признателен, если бы вы могли дать более глубокое объяснение. – Jeka

+0

Я только что ответил. –

ответ

1

Внутренний интерфейс и внутренние классы используются, когда они имеют смысл, например, здесь только класс RecyclerItemClickListener использует интерфейс OnItemClickListener, поэтому он имеет смысл внутри класса RecyclerItemClickListener.

Поэтому, когда вы хотите подчеркнуть, что что-то не имеет никакого смысла вне того, что вы его гнездиваете или помещаете в класс.

Обратите внимание, как в вашей деятельности вы звоните: new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() эта часть new RecyclerItemClickListener.OnItemClickListener() подчеркнул, что интерфейс внутри класса RecyclerItemClickListener, кажется, этот интерфейс не имеет смысла быть вне, так как это не использовать что-нибудь еще, так что внутри RecyclerItemClickListener класс ,

Посмотрите эти сообщения для получения дополнительной информации: here, here и here

1
Hey if you see the constructor of the RecyclerItemClickListener class . the OnItemClickListener is initialized inside the constructor . 

and when we are calling the RecyclerItemClickListener. we are providing second argument for the initialization of the listener. 


and inside the onInterceptTouchEvent method we are calling the onItemClick(View view,int position) method of the listener by filling appropriate data . 

вы отправляете ссылку, если вы звоните в RecyclerItemClickListener.

1

Если вы знаете, как работает interface, вы легко поймете это. Поскольку RecyclerView не имеет прослушивателя кликов, этот парень создал свой собственный класс, который реализует RecyclerView.OnItemTouchListener. Итак, теперь, когда пользователь прикасается к RecyclerView item, он ловит штрих-код в onInterceptTouchEvent.

Итак, теперь он узнает, что пользователь нажал на элемент, поэтому он делает интерфейс OnItemClickListener в том же классе, и вы реализуете этот интерфейс в своем классе Activity, и вам нужно написать код, что произойдет после щелчок.

Но как он срабатывает, когда пользователь нажимает?

Вы видите линии

clickListener.onItemClick(childView,rv.getChildAdapterPosition(childView)); 

Эта линия в свою очередь, вызывает onItemClickListener вашей деятельности, поэтому его называют спиной к вашей деятельности, чтобы вы знали, что пользователь прикоснулся деталь.

Надеюсь, вы поняли :)

Смежные вопросы