2017-02-16 2 views
-1

Ich arbeite mit einem RecyclerView und versuche, OnClick und OnLongClick für jedes Element im RecyclerView festzulegen. Ich entschuldige mich, aber ich glaube nicht, ich wirklich verstehen, was mit dem Code los ist, wurde einige davon Folien für meine Aufgabe und einige Patches für Sachen, die nicht funktionieren würde, dass ich auf dieser Website gefunden. An der Spitze meiner RecyclerView Adapter Klasse hav ich statische OnItemClickListener mItemClickListener; `Und dann habe ich eine Schnittstelle für meine neue Methoden, um ein Verfahren, meinen clicklistener gesetzt, und dann Umsetzung meines ViewHolder etwa so:Die Methode setOnItemClickListener für RecyclerView kann nicht aufgelöst werden.

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

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

    public static class ViewHolder extends RecyclerView.ViewHolder { 
     public ImageView movieImage; 
     public TextView movieName; 
     public TextView movieDescription; 
     public CheckBox movieCheckBox; 
     public CardView cV; 

     public ViewHolder(View view) { 
      super(view); 

      movieImage = (ImageView) view.findViewById(R.id.movieImg); 
      movieName = (TextView) view.findViewById(R.id.movieName); 
      movieDescription = (TextView) view.findViewById(R.id.movieDescription); 
      movieCheckBox = (CheckBox) view.findViewById(R.id.movieCheckBox); 

      view.setOnClickListener(new View.OnClickListener(){ 
       @Override 
       public void onClick(View v) { 
        if (mItemClickListener != null) { 
         if (getAdapterPosition() != RecyclerView.NO_POSITION) { 
          mItemClickListener.onItemClick(v, getAdapterPosition()); 
         } 
        } 
       } 
      }); 

      view.setOnLongClickListener(new View.OnLongClickListener() { 
       @Override 
       public boolean onLongClick(View v) { 
        if (mItemClickListener != null) { 
         if (getAdapterPosition() != RecyclerView.NO_POSITION) { 
          mItemClickListener.onItemLongClick(v, getAdapterPosition()); 
         } 
        } 
        return true; 
       } 
      }); 
     } 
    } 

Meines Das Problem kommt in der Klasse für mein Fragment, das die Recycler-Ansicht besitzt, wo ich versuche, den onitemclicklistener zu setzen.

myAdapter = new MyRecyclerAdapter(); 

     myAdapter.setOnItemClickListener(new MyRecyclerAdapter.OnItemClickListener() { 
      @Override 
      public void onItemClick(View view, int position) { 
       Log.d("TEST", "onItemClick"); 
      } 

      @Override 
      public void onItemLongClick(View view, int position) { 
       Log.d("TEST", "onItemLongClick"); 
      } 
     }); 

Es sagt das Problem mit myAdapter.setOnItemClickListener ist, sagt es

'Cannot resolve method 'setOnItemClickListener(anonymous com.example.kevin.assignment4.MyRecyclerAdapter.OnItemClickListener)'
Aber ich weiß nicht, warum es das zu sagen ist. Es sollte in der Lage sein, die Methode so gut wie möglich zu finden.

EDIT: Meine Importe für MyRecyclerView Klasse sind wie folgt:

import android.support.v7.widget.CardView; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.view.animation.Animation; 
import android.view.animation.AnimationUtils; 
import android.widget.CheckBox; 
import android.widget.ImageView; 
import android.widget.TextView; 

import java.util.HashMap; 
+0

Warum Sie den Adapter klicken und lange klicken? Sie können auch den Klick und den langen Klick von Recyclerview verwenden. Verwenden Sie diese Option und versuchen Sie es. – dipali

+0

haben Sie die OnItemClickListener-Schnittstelle für das Fragment – Sanjeet

+0

@dipali implementiert Ich muss in der Lage sein zu sagen, welches einzelne Element in der RecyclerView-Liste angeklickt wurde. Ein Teil der Aufgabe besteht darin, verschiedene Dinge mit den Elementen in der Liste zu tun, basierend darauf, ob ich einen normalen Klick oder einen langen Klick gemacht habe. – KevinCamacho

Antwort

0

Also ich bin nicht sicher, warum meine ursprüngliche Methode funktionierte nicht, da ich online ähnliche Verfahren gesehen habe und auch nur eine der Antworten gepostet hier gearbeitet, um die gleiche Art und Weise. Ich habe mein Problem gelöst, indem ich die Struktur meiner Adapterklasse so geändert habe, dass der Listener als Parameter für den Konstruktor des RecyclerView-Adapters verwendet wird. Dort habe ich den Hörer in der Klasse gleich dem Hörer, die in kam.

public MyRecyclerAdapter(ClickListener clickListener) { 
     setClickListener(clickListener); 
    } 

Und dann in meinem Fragment, wo ich die recyclerview erstellen Ich habe

myAdapter = new MyRecyclerAdapter(this);

Meine Fragment-Klasse implementiert die Schnittstelle von meiner Adapterklasse.

1

ich gleiche Sache und seiner Arbeits kühlen versucht. Überprüfen Sie dies.

public class MyFragment extends BaseFragment implements SwipeRefreshLayout.OnRefreshListener{ 

    private MyAdapter mAdapter; 


    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     setHasOptionsMenu(true); 
     //init views 
     final View root = inflater.inflate(R.layout.layout, container, false); 
     RecyclerView rv = (RecyclerView) root.findViewById(R.id.recyclerview); 

     mAdapter = new MyAdapter(getActivity(), data); 
     mAdapter.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(View view, int position) { 
       Toast.makeText(getActivity(), "Working...", Toast.LENGTH_LONG).show(); 
      } 
     }); 
     rv.setAdapter(mAdapter); 
     rv.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL)); 

     return root; 
    } 

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

    private class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

     private ArrayList<Data> data; 
     private Context mContext; 

     MyAdapter(Context context, ArrayList<Data> data) { 
      this.data = data; 
     } 

     private OnItemClickListener onItemClickListener; 

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

     class MyHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

      MyHolder(View itemView) { 
       super(itemView); 

       itemView.setOnClickListener(this); 
      } 

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

Es scheint also der einzige Unterschied zwischen dem, was ich habe und dem, was Sie haben, ist, dass Sie onClick in der internen Klasse von ViewHolder etwas anders implementiert haben. Ich habe deine Methode ausprobiert und bin immer noch auf dasselbe Problem gestoßen. – KevinCamacho

+0

Ich habe es mein Ende und seine Arbeit getestet. Ich weiß nicht, warum es nicht für dich funktioniert. –

Verwandte Themen