2015-05-27 12 views
5

Wdrażam szufladę nawigacji z RecyclerView, korzystając z samouczka this, ale nie chcę stosować całego samouczka, po prostu chcę obsłużyć kliknięcie użytkownika. Mam wdrożyła onClickListener wewnątrz ViewHolder mojego MyAdapter Klasa:RecyclerView onItemClicked callback

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener{ 
    int Holderid; ImageView imageView, profile; 
    TextView textView, Name, email, drawerTitle; 

    private ClickListener listener; 
    // ViewHolder Constructor with View and viewType as a parameter 
    public ViewHolder(View itemView, int ViewType, ClickListener listener) { 
     super(itemView); 

     if (ViewType == TYPE_HEADER){ 
      itemView.setClickable(false); 
      Name = (TextView) itemView.findViewById(R.id.user_name); 
      email = (TextView) itemView.findViewById(R.id.user_email); 
      profile = (ImageView) itemView.findViewById(R.id.circleView); 

      Holderid = 0; 
     } 
     if(ViewType == TYPE_ITEM) { 
      itemView.setClickable(true); 
      textView = (TextView) itemView.findViewById(R.id.rowText); 

      imageView = (ImageView) itemView.findViewById(R.id.rowIcon); 

      Holderid = 1; 

      // Handle item click and set the selection 
     } 
     if(ViewType == TYPE_SEPARATOR){ 
      itemView.setClickable(false); 
      drawerTitle = (TextView) itemView.findViewById(R.id.drawerTitle); 

      Holderid = 2; 
     } 
     this.listener = listener; 
     itemView.setOnClickListener(this); 
     itemView.setOnLongClickListener(this); 
    } 
    int pos; 
    @Override 
    public void onClick(View v) { 
     if (listener != null) { 
      listener.onItemClicked(getPosition()); 
      pos= getPosition(); 
      Log.d("TAG", "Item clicked at position " + getPosition()); 
     } 
    } 

    @Override 
    public boolean onLongClick(View v) { 
     if (listener != null) { 
      return listener.onItemLongClicked(getPosition()); 
     } 

     return false; 
    } 
    public interface ClickListener { 
     public void onItemClicked(int position); 
     public boolean onItemLongClicked(int position); 
    } 
} 

Co nie mogę zrozumieć, jak zastosować ClickListener do obiektu MyAdapter:

 mAdapter = new MyAdapter(dataList, mSelectedPositions, ...?); 

tak, że gdy użytkownik klika jeden przedmiot, mogę obsłużyć kliknięcie użytkownika na MainActivity.

Utworzyłem Adapter ten sposób (jak opisano w poradniku):

Cały MyAdapter Klasa: http://pastie.org/private/cibcsj3zieorlkcgh2rm1g

i to jest moja klasa główną działalność onCreate:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    /* Assigning the toolbar object ot the view 
    and setting the the Action bar to our toolbar */ 
    toolbar = (Toolbar) findViewById(R.id.tool_bar); 
    setSupportActionBar(toolbar); 
    // enable ActionBar app icon to behave as action to toggle nav drawer 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); //pulsante drawer 
    getSupportActionBar().setHomeButtonEnabled(true);  //pulsante dietro 

    //Initializing 
    mTitle = mDrawerTitle = getTitle(); 
    SharedPreferences usrData = getSharedPreferences(
            usr_loggedin, 
            MODE_PRIVATE); 
    AVATARresID = R.mipmap.aka; 

    // Add Drawer Item to dataList 
    dataList = new ArrayList<>(); 
    dataList = prepareDatalist(dataList, NAME, EMAIL, AVATARresID); 

    mRecyclerView = (RecyclerView) findViewById(R.id.RecyclerView); 
    mRecyclerView.setHasFixedSize(true); 
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 

    mAdapter = new MyAdapter(dataList, mSelectedPositions); //**ERROR HERE** 

    mRecyclerView.setAdapter(mAdapter); 
    mLayoutManager = new LinearLayoutManager(this); 

    mRecyclerView.setLayoutManager(mLayoutManager); 

    // Drawer Listener set to the Drawer toggle 
    mDrawerLayout.setDrawerListener(mDrawerToggle); 
    mDrawerToggle.syncState(); // Finally we set the drawer toggle sync State 
} 

Jak czy wyciągam wynik onClick, który jest obecny w klasie MyAdapter z powrotem do mojego ,

int pos; 
    @Override 
    public void onClick(View v) { 
     if (listener != null) { 
      listener.onItemClicked(getPosition()); 
      pos= getPosition(); 
      Log.d("TAG", "Item clicked at position " + getPosition()); 
     } 
    } 

dzięki czemu mogę obsługiwać działania w zależności od pozycji klikniętego przedmiotu?

Odpowiedz

1

Konstruktor obiektu MyAdapter zajmuje również obiekt klasy implementującej ClickListener. Można na przykład, niech Activity/Fragment implementuje ten interfejs i używać this jako parametr

public class MainActivity extends Activity implements ViewHolder.ClickListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    // .... 
    mAdapter = new MyAdapter(dataList, mSelectedPositions, this); 
    // .... 
    } 
+0

ja przedłużony 'realizuje View.OnClickListener' i ' mAdapter = new MyAdapter (DataList, mSelectedPositions, this); 'zrobiłeś tak, jak powiedziałeś, ale słowo kluczowe' this' nie staje się 'ClickListener' ... co masz na myśli? –

+0

musisz zaimplementować 'ViewHolder.OnClickListener' – Blackbelt

+0

W ten sposób zaimplementowałem' implementuje RecyclerView.ViewHolder.ClickListener' ale mówi 'nie można rozwiązać symbolu ClickListener' ... –