2015-02-09 2 views
2

я следующий адаптеромИспользование же Ресайклер адаптера для накачивания различных видов деятельности

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

List<String> list; 
int id; 
Context context; 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view= LayoutInflater.from(parent.getContext()).inflate(id,parent,false); 
    return new ViewHolder(view); 

} 

@Override 
public void onBindViewHolder(final ViewHolder holder, final int position) { 
     holder.textView.setText(list.get(position)); 

     holder.textView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Handler handler=new Handler(); 
       handler.postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         Intent intent = new Intent(context, BESyllabus.class); 
         context.startActivity(intent); 
        } 
       },500); 

      } 
     }); 
} 

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


public static class ViewHolder extends RecyclerView.ViewHolder{ 
    public TextView textView; 
    public CardView cardView; 
    public ViewHolder(View v){ 
     super(v); 
     textView=(TextView)v.findViewById(R.id.text); 
     cardView=(CardView)v.findViewById(R.id.card_view); 
    } 
} 

public CardAdapter(List<String> list, int id,Context context){ 
    this.list=list; 
    this.id=id; 
    this.context=context; 
} 

} 

Я использую тот же файл макет, который имеет recyclerView, который использует вышеупомянутый адаптер, идентификатор является идентификатором ресурса для файла макета, который я использовать как строки для ресайклера view`

<?xml version="1.0" encoding="utf-8"?> 

<TextView 
    android:id="@+id/text" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textColor="#000000" 
    android:alpha="0.87" 
    android:layout_marginLeft="8dp" 
    android:layout_marginRight="8dp" 
    android:layout_marginTop="8dp" 
    android:textSize="35dp" /> 

Что я хочу сделать, это раздуть несколько действий, используя ту же структуру строк, используя тот же самый адаптер. Он отлично работает при отображении строк, но тот же самый onClickListener используется во всех действиях, которые перезапускают одно и то же действие каждый раз, когда я нажимаю. Есть ли способ использовать тот же адаптер, где я могу назначить слушателей на основе активности. Или я должен создать новый адаптер для каждого действия? Я новичок в разработке Android, поэтому любая помощь будет оценена. Спасибо заранее.

+0

Использование обработчика в вашем onClickListener не требуется, код onClickListener уже запущен в потоке пользовательского интерфейса (если только вы не хотите, чтобы 0,5-секундная задержка была ... тогда nvm) – petey

ответ

0

Вы должны пройти OnClickListener к CardAdapter (на его конструктор может быть) и реализовать его на активность работы с этим адаптером.

public class ActivityX extends Activity implements View.OnClickListener { 
    CardAdapter adapter; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ... 
     adapter = new CardAdapter(this) 
    } 

    public void onClick(View v) { 
     // Handle click here 
     String string = (String) v.getTag(); 
    } 
} 

Ваш адаптер может выглядеть следующим образом:

public class CardAdapter extends RecyclerView.Adapter<CardAdapter.ViewHolder> { 
    View.OnClickListener onClickListener; 

    public CardAdapter(View.OnClickListener onClickListener) { 
     this.onClickListener = onClickListener; 
    } 

    @Override 
    public void onBindViewHolder(final ViewHolder holder, final int position) { 
     // Saving object from list at given position in View tag 
     holder.setTag(list.get(position)); 
     holder.textView.setText(list.get(position)); 

     holder.textView.setOnClickListener(onClickListener); 
    } 
} 
+0

Но как я могу получить позицию элемента, нажатого в прослушиватель – AnoopDV

+0

@AnoopDV Отредактировано для получения объекта из списка по указанному индексу – Gorcyn

+0

Если вам нужен и просмотр, и индекс, проверьте на @tinuviel ответ;) – Gorcyn

0

Вы можете передать слушателю в качестве аргумента конструктора к адаптеру

0

В this answer есть реализация в onItemClickListener для зрения ресайклера. Вы можете переместить код из вашего onClickListener в другой onItemClickListener для каждого различного действия, которое вам нужно.

+0

Это сработало ... спасибо ,Но я использовал библиотеку для создания эффекта пульсации, и она остановилась, когда я использую этот прослушиватель, я не знаю, связано ли это или нет, если у вас есть какие-либо иероглифы, пожалуйста, делите – AnoopDV

1

Использование интерфейса:

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

    private IOnItemClickListener mListener; 

    public CardAdapter(IOnItemClickListener mListener) { 
     this.mListener = mListener; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view= LayoutInflater.from(parent.getContext()).inflate(id,parent,false); 

     return new ViewHolder(v, new CardAdapter.ViewHolder.IMyViewHolderClicks() { 
      public void onClick(View v, int position) { 
       mListener.onItemClick(v, position); 
      }; 
     }); 

    } 

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     public TextView textView; 
     public CardView cardView; 
     public IMyViewHolderClicks mListener; 

     public ViewHolder(View v, IMyViewHolderClicks listener) { 
      super(itemView); 
      mListener = listener; 

      textView=(TextView)v.findViewById(R.id.text); 
      cardView=(CardView)v.findViewById(R.id.card_view); 
     } 

     @Override 
     public void onClick(View v) { 
      mListener.onClick(v, getPosition()); 
     } 

     public interface IMyViewHolderClicks { 
      public void onClick(View v, int position); 
     } 
    } 
} 
public interface IOnItemClickListener { 
    public void onItemClick(View v, int position); 
} 
0

Прежде всего, то, что является причиной для использования задержки обработчика в setOnClickListener? Этот код приведет к исключению NullPointerException в случаях, когда контекст был уничтожен раньше.

Что касается вопроса, вы можете передать onClickListener через конструктор, как в предыдущих ответах, передать только переменную класса целевой активности, сделать событие трансляции. Это зависит от ваших потребностей. Но самое подходящее в большинстве случаев, я думаю, не делает onClickListener внутри адаптера, вместо этого вместо onItemClickListener просмотра recycler (как ответ @tinuviel). В этом случае автоматически отображается анимированное состояние перепрограммированного представления.

+0

. Я использую анимацию для событий click, поэтому для сдачи завершение анимации я использую задержку – AnoopDV

+0

Также, что приведет к исключению NullPointer, обработчику или setOnClickListener – AnoopDV

+0

Ничего из этого, исключение null будет выбрано, если андроид выпустил контекст до того, как будет вызван контекст.startActivity (намерение) (экземпляр адаптера также будут удалены). В этом случае вы можете проверить это, установив точку останова в строке «Intent intent = new Intent (контекст, BESyllabus.class)»; чем нажать кнопку «домой» (при этом не сохраняйте настройки устройства устройства), а затем вернитесь в приложение. В реальном жизненном цикле приложения это будет не так часто, но если у приложения будет много пользователей, вероятность увеличится. – Beloo

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