2017-01-21 17 views
1

私はRecyclerViewに存在するフラグメントを持っています。私はWebページからJSONデータを解析し、このRecyclerViewでチュートリアルを使って示しました:https://www.learn2crack.com/2016/02/recyclerview-json-parsing.htmlJSONデータの解析後にonClickをRecyclerViewに追加する

ここで、RecClickerの項目にonClickを追加します。静的なRecyclerViewアイテムの場合、そのようにする方法はわかっていますが、この場合はsetOnClickListenerを知らないのです。静的なリサイクルビューアイテムの場合、このクラスをonClickイベントに使用しています。

package com.parassidhu.cdlumaths; 

import android.support.v7.widget.RecyclerView; 
import android.view.View; 

public class ItemClickSupport { 
    private final RecyclerView mRecyclerView; 
    private OnItemClickListener mOnItemClickListener; 
    private OnItemLongClickListener mOnItemLongClickListener; 
    private View.OnClickListener mOnClickListener = new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (mOnItemClickListener != null) { 
       RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v); 
       mOnItemClickListener.onItemClicked(mRecyclerView, holder.getAdapterPosition(), v); 
      } 
     } 
    }; 
    private View.OnLongClickListener mOnLongClickListener = new View.OnLongClickListener() { 
     @Override 
     public boolean onLongClick(View v) { 
      if (mOnItemLongClickListener != null) { 
       RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v); 
       return mOnItemLongClickListener.onItemLongClicked(mRecyclerView, holder.getAdapterPosition(), v); 
      } 
      return false; 
     } 
    }; 
    private RecyclerView.OnChildAttachStateChangeListener mAttachListener 
      = new RecyclerView.OnChildAttachStateChangeListener() { 
     @Override 
     public void onChildViewAttachedToWindow(View view) { 
      if (mOnItemClickListener != null) { 
       view.setOnClickListener(mOnClickListener); 
      } 
      if (mOnItemLongClickListener != null) { 
       view.setOnLongClickListener(mOnLongClickListener); 
      } 
     } 

     @Override 
     public void onChildViewDetachedFromWindow(View view) { 

     } 
    }; 

    private ItemClickSupport(RecyclerView recyclerView) { 
     mRecyclerView = recyclerView; 
     mRecyclerView.setTag(R.id.item_click_support, this); 
     mRecyclerView.addOnChildAttachStateChangeListener(mAttachListener); 
    } 

    public static ItemClickSupport addTo(RecyclerView view) { 
     ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support); 
     if (support == null) { 
      support = new ItemClickSupport(view); 
     } 
     return support; 
    } 

    public static ItemClickSupport removeFrom(RecyclerView view) { 
     ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support); 
     if (support != null) { 
      support.detach(view); 
     } 
     return support; 
    } 

    public ItemClickSupport setOnItemClickListener(OnItemClickListener listener) { 
     mOnItemClickListener = listener; 
     return this; 
    } 

    public ItemClickSupport setOnItemLongClickListener(OnItemLongClickListener listener) { 
     mOnItemLongClickListener = listener; 
     return this; 
    } 

    private void detach(RecyclerView view) { 
     view.removeOnChildAttachStateChangeListener(mAttachListener); 
     view.setTag(R.id.item_click_support, null); 
    } 

    public interface OnItemClickListener { 

     void onItemClicked(RecyclerView recyclerView, int position, View v); 
    } 

    public interface OnItemLongClickListener { 

     boolean onItemLongClicked(RecyclerView recyclerView, int position, View v); 
    } 
} 

私のアダプタクラスがある:

package com.parassidhu.cdlumaths; 

import android.content.ClipData; 
import android.content.Intent; 
import android.net.Uri; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.parassidhu.cdlumaths.R; 
import com.parassidhu.cdlumaths.Android; 

import java.util.ArrayList; 

public class NoticesData extends RecyclerView.Adapter<NoticesData.ViewHolder> { 

    private ArrayList<Android> mAndroidList; 
    private RecyclerView recyclerView; 
    public NoticesData(ArrayList<Android> androidList, RecyclerView rcl) { 
     mAndroidList = androidList; 
     recyclerView=rcl; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.notices_row, parent, false); 
     return new ViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(final ViewHolder holder, int position) { 
     holder.mTvName.setText(mAndroidList.get(position).getName()); 
     ItemClickSupport.addTo(recyclerView).setOnItemClickListener(new ItemClickSupport.OnItemClickListener() { 
      @Override 
      public void onItemClicked(RecyclerView recyclerView, int position, View v) { 
      //I can't call Toast or startIntent here 
      } 
     }); 
    } 

    @Override 
    public int getItemCount() { 
     return mAndroidList.size(); 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder{ 

     private TextView mTvName; 
     public ViewHolder(View view) { 
      super(view); 
      mTvName = (TextView)view.findViewById(R.id.tv_name); 
     } 
    } 
} 
+0

アダプタクラスのコードはどこですか? – OBX

+0

数時間後に投稿します –

+0

@スーパーマン私はそれを追加しました。 –

答えて

1

public void showToast(int position) { 
    Toast.makeText(getActivity(), "Clicked position is " + position, Toast.LENGTH_SHORT).show(); 
} 

(私はgetActivity()を使用して、あなたがフラグメントを使用していると思う)

以下のようなメソッドを作成する今、この

... 
... 
private YourFragment frag; 

public NoticesData(ArrayList<Android> androidList, RecyclerView rcl, YourFragment fragment) { 
    mAndroidList = androidList; 
    recyclerView = rcl; 
    frag = fragment; 
} 
のようなあなたのアダプタのコンストラクタを更新

あなたのフラグメントアップデートでこのようなアダプタの初期化

NoticesData notice = NoticesData(androidList, rcl, YourFragment.this); 

今注

ItemClickSupport.addTo(recyclerView).setOnItemClickListener(new ItemClickSupport.OnItemClickListener() { 
     @Override 
     public void onItemClicked(RecyclerView recyclerView, int position, View v) { 

      frag.showToast(position); // it's like callback method 

     } 
    }); 

アダプタに以下のような showToast()メソッドを呼び出します。ここYourFragmentはあなたのRecyclerViewをホストするフラグメントを意味します。

+1

Thankssss!それは魅力のように働いた。ちょうど私が探していたもの:) –

0

あなたはそのリサイクルビュー用アダプタからあなたリサイクルビューで項目ごとにリスナーをクリックし設定する必要があります。リサイクラビューのアイテム(ビュー)にそのビューのonClickListenerを追加することができる場合は、それぞれのデータを設定します。あなたの活動や断片クラスで

+0

アダプタクラスからonClickListenerを追加できますが、アダプタクラスでいくつかのアクションを実行できません。たとえば、startIntentまたはShow Toastを使用できません。私は別の何かをしなければならないのですか? –

関連する問題