2017-02-16 13 views
-1

RecyclerViewで作業していますが、RecyclerViewの各アイテムのOnClickとOnLongClickを設定しようとしています。私はお詫びしますが、私は考えません本当にはコードで何が起こっているのかを理解しています。私の割り当てのためのスライドと、私がこのサイトで見つけたものではうまくいかないもののパッチを取ったものもあります。私RecyclerViewアダプタクラスのトップで私は 静的OnItemClickListener mItemClickListenerを肝炎; `そして私はそうのように私の新しいメソッドのためのインタフェース、私clicklistenerを設定する方法、そして私のViewHolderの実装があります。RecyclerViewのメソッドsetOnItemClickListenerを解決できません

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

私を問題は、私がonitemclicklistenerを設定しようとしているリサイクラビューを所有している私のフラグメントのクラスに入っています。

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"); 
      } 
     }); 

これは、問題はそれが

'Cannot resolve method 'setOnItemClickListener(anonymous com.example.kevin.assignment4.MyRecyclerAdapter.OnItemClickListener)'
を言います。しかし、それはそれを言っている理由を私は知らないmyAdapter.setOnItemClickListenerであると言います。私が知る限り、方法を見つけることができるはずです。私は同じこと、その作業クールを試してみました

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

アダプタークリックとロングクリックを使用する理由は?recyclerviewのクリックとロングクリックも使用できます。これを使用して試してみてください。 – dipali

+0

フラグメント化するためのOnItemClickListenerインターフェイスを実装しました – Sanjeet

+0

@dipali RecyclerViewリスト内の個々のアイテムがクリックされたことを伝える必要があります。課題の一部は、私が通常のクリックをしたか長いクリックをしたかに基づいて、リスト内のアイテムとは異なることをしています。 – KevinCamacho

答えて

0

私は同じように働いていた、オンラインと一つでもここに掲載の回答の同様の方法を見てきましたので、だから私は、私の元のメソッドが機能しなかった理由はわかりません。私は自分のアダプタクラスの構造を変更してリスナーをRecyclerViewアダプタのコンストラクタのパラメータとして取り込むことで問題を解決しました。私のフラグメントクラスが実装してあり、私は

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

。入って来たリスナーと同じクラスでリスナーを設定してから、私のフラグメントに私は私が持っているrecyclerview

myAdapter = new MyRecyclerAdapter(this);

を作成する場所私のアダプタクラスからのインターフェイス。

1



EDIT:次のようにMyRecyclerViewクラスの私の輸入があります。これをチェックして。

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

したがって、ViewHolderの内部クラス内でonClickをわずかに異なる方法で実装しただけで、私が持っているものと唯一の違いがあるようです。あなたの方法を試してみましたが、私はまだ同じ問題にぶつかります。 – KevinCamacho

+0

私は私の終わりとその動作をテストしました。私はなぜそれがあなたのために働いているのか分かりません。 –

関連する問題