2017-01-21 2 views
1

У меня есть фрагмент, в котором находится RecyclerView. Я проанализировал данные JSON с веб-страницы и показал ее в этом RecyclerView с помощью учебника: https://www.learn2crack.com/2016/02/recyclerview-json-parsing.htmlДобавление onClick to RecyclerView после разбора данных JSON

Теперь я хочу добавить onClick в элементы RecyclerView. Я знаю, как это сделать для статических элементов RecyclerView, но в этом случае не знаю setOnClickListener. Для статических элементов recyclerview я использую этот класс для событий 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

@Superman Я добавил. –

ответ

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

Теперь вызовите метод showToast(), как показано ниже в адаптере

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 

     } 
    }); 

Примечание: здесь YourFragment означает фрагмент, который хозяйничает ваш RecyclerView.

+1

Спасибо! Оно работало завораживающе. Просто то, что я искал :) –

0

вы должны установить кнопку слушателя для каждого из элементов в вашей точке зрения ресайклера от адаптера для этой точки зрения ресайклера. когда вы устанавливаете данные для каждого, если элементы (представления) в представлении ресайклера вы можете добавить onClickListener для этого представления тоже.

+0

Я могу добавить onClickListener из класса адаптера, но я не могу выполнять некоторые действия в классе адаптера, например, я не могу запуститьIntent или показать Toast. Должен ли я делать что-то другое? –

Смежные вопросы