2016-12-20 6 views
0

私はrecyclerviewでカスタムダイアログビューを使用していますが、私はrecyclerviewでデータを正常に取得しましたが、recyclerview clickイベントが警告ダイアログで機能しない

@Override 
     protected void onPostExecute(String s) { 
      super.onPostExecute(s); 
      pDialog.dismiss(); 
      final AlertDialog.Builder builderSingle = new AlertDialog.Builder(mContext); 
      final AlertDialog OptionDialog = builderSingle.create(); 
      builderSingle.setTitle("Select Card"); 

      View view = ((Activity)mContext).getLayoutInflater().inflate(R.layout.activity_payment, null); 

      RecyclerView list1 = (RecyclerView) view.findViewById(R.id.recyclerview); 
      final LinearLayoutManager mLayoutManager; 
      mLayoutManager = new LinearLayoutManager(mContext); 
      list1.setLayoutManager(mLayoutManager); 
      list1.setItemAnimator(new DefaultItemAnimator()); 
      AdapterDialogCard adapter = new AdapterDialogCard(mContext, list); 
      list1.setAdapter(adapter); 


      list1.addOnItemTouchListener(new RecyclerTouchListener(mContext, list1, new RecyclerTouchListener.ClickListener() { 
       @Override 
       public void onClick(View view, int position) { 
        CreditCard item = list.get(position); 
        cardid  = item.getId(); 
        OptionDialog.dismiss(); 
       } 

       @Override 
       public void onLongClick(View view, int position) { 

       } 
      })); 

      builderSingle.setNegativeButton("cancel", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.dismiss(); 
       } 
      }); 

      builderSingle.setView(view); 
      builderSingle.show(); 
     } 
    } 

これは私が結果として得たものです。

enter image description here

ので、私の質問は、警告ダイアログで、リスナーをクリックして設定する方法です。

+0

http://stackoverflow.com/questions/24885223/why-doesnt-recyclerview-have-onitemclicklistener-and-how-recyclerview-is-dif – PeDuCKA

+0

何らかの理由で私はonBindviewHolderで自分のデータを取得できません。だから私はrecyclerviewのクリックイベントが必要です。 –

+0

ここにAdapterDialogCardクラスを投稿してください –

答えて

0

申し訳ありませんが、みんなを。その愚かな間違いが、私はついにそれを解決しました。私はちょうど私のItemTouchListenerを@Newbieアンドロイドの答えと比較します。私は自分のクラスで、ビューの位置を取得するためにデリレケートされたメソッドを使用していることがわかりました。ここ

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

      View child = rv.findChildViewUnder(e.getX(), e.getY()); 
      if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) { 
       clickListener.onClick(child, rv.getChildPosition(child)); 
      } 
      return false; 
     } 

rv.getChildPostion()は廃止予定なので、私はちょうどrv.getChildAdapterPosition()に変更し、奇跡が起きるれます。私はこれがダイアログで問題になるとは考えていませんでした。

0

RecycleViewを使用しているということは、RecycleAdapterも使用していることを意味します。 あなたは以下のようなアダプタのonBindViewHolderの内側にあなたのリスナーを追加する場合、それは動作します:

@Override 
    public void onBindViewHolder(final ViewHolder holder, int position) { 
    CreditCard item = list.get(position); 
    holder.itemView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      ///do your code here// 
     } 
    }); 
} 

それが動作するかではない場合は私に知らせてください。

public interface AdapterClickListener { 
    void onClick(int position, View view); 
} 

にそのインターフェイスのオブジェクトを渡します - あなたはItemTouchListener

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener { 
private OnItemClickListener mListener; 

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

private GestureDetector mGestureDetector; 

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

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

@Override 
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 

} 
} 

を拡張し、インターフェイスを作成し、このコード

rv.addOnItemTouchListener(
      new RecyclerItemClickListener(context, new RecyclerItemClickListener.OnItemClickListener() { 
       @Override 
       public void onItemClick(View view, int position) { 

        dialog.dismiss(); 
       } 
      }) 
    ); 
+0

私は私のonBindviewholderでデータを取得できますが、ここで私は使用できません。 –

0

アダプタクラスのコンストラクタ:

アダプタクラスのコンストラクタで今
AdapterDialogCard adapter = new AdapterDialogCard(mContext, list, new AdapterClickListener() { 
     @Override 
     public void onClick(final int position, View view) { 
      //Your code 
     } 
    }); 

は、:

public AdapterClass(Your Other objects, AdapterClickListener adapterClickListener){ 
     this.adapterClickListener = adapterClickListener; 
     //Other Code 
} 

さて、アダプタクラスではホルダーにクリックリスナを実装します。

itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if (adapterClickListener != null) { 
         adapterClickListener.onClick(getAdapterPosition(), v); 
        } 
       } 
      }); 
+0

これは私がすでに使っているものです。私はいつもアンドロイドを好む –

0

このクラスの使用を呼び出す必要が

関連する問題