2016-08-31 4 views
1

Извините, если это свернуто ...Как получить индекс от моего адаптера, используя представление?

Я пытаюсь создать задачу Async, которая обновляет значение в адаптере просмотра ресайклера при его нажатии. Моя проблема в том, что я не могу получить определенную строку из поезда LiastArray из представления, которое возвращается onClick одной из строк RecyclerView.

public void ArrivalTimeOnClickListener(View view) { 
    pbArrivalTime = (ProgressBar)view.findViewById(R.id.pbArrivalTime); 
    tvArrivalTime = (TextView)view.findViewById(R.id.tvArrivalTime); 

    /** 
    * GET ADAPTER INDEX HERE 
    * 
    * TRIED: 
    * int trainIndex = rvTrainTimetable.getChildAdapterPosition(view.findViewById(R.id.rlTrainRoot)); 
    */ 

    new RefreshSingleArrivalTime().execute(view); 
} 

По сути, у меня есть поезд класса с базовой платформой, время прибытия, место назначения и т.д. полей с добытчиками и сеттеров. Я затем установить адаптер с ArrayList от железнодорожного класса, и в RuEn назначая адаптер к моему RecyclerView:

private void InitializeTrainTimetable() { 
    trains = new ArrayList<Train>(); 
    trains.add(new Train("Artarmion Platform 3", 7, "On time", "Ahfield", "15:01")); 
    trains.add(new Train("TEST", 97, "TEST", "TEST", "TEST")); 

    trainAdapter = new TrainAdapter(this, trains); 

    rvTrainTimetable = (RecyclerView) findViewById(R.id.rvTrainTimetable); 

    rvTrainTimetable.setLayoutManager(new LinearLayoutManager(getApplicationContext())); 
    rvTrainTimetable.setItemAnimator(new DefaultItemAnimator()); 
    rvTrainTimetable.setAdapter(trainAdapter); 
} 

Мой TrainAdapter определяется следующим образом:

public class TrainAdapter extends RecyclerView.Adapter<TrainAdapter.ViewHolder> { 
    private ArrayList<Train> mTrains; 

    public TrainAdapter(Context context, ArrayList<Train> trains){ 
     mTrains = trains; 
    } 

    /** Inflates xml layout file */ 
    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.train_item, parent, false); 

     return new ViewHolder(itemView); 
    } 

    /** Initialise and assign values for eah row in recycler view */ 
    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     Train train = mTrains.get(position); 

     holder.mArrivalTime.setText(String.format(Constants.REMAINING_MINS, train.getArrivalTime())); 
     holder.mPlatform.setText(train.getPlatform()); 
     // TOODO: get actual time 
     holder.mTime.setText("14:14"); 
     holder.mStatus.setText(train.getStatus()); 
     holder.mDestinationTime.setText(train.getDestinationTime()); 
     holder.mDestination.setText(train.getDestination()); 
    } 

    /** Returns number of items in list */ 
    @Override 
    public int getItemCount() { 
     return mTrains.size(); 
    } 

    /** Initialises xml elements */ 
    class ViewHolder extends RecyclerView.ViewHolder { 
     public TextView mArrivalTime; 
     public TextView mPlatform; 
     public TextView mTime; 
     public TextView mStatus; 
     public TextView mDestinationTime; 
     public TextView mDestination; 

     /** Initialises xml elements */ 
     public ViewHolder(View itemView) { 
      super(itemView); 
      mArrivalTime = (TextView) itemView.findViewById(R.id.tvArrivalTime); 
      mPlatform = (TextView) itemView.findViewById(R.id.tvPlatform); 
      mTime = (TextView) itemView.findViewById(R.id.tvTime); 
      mStatus = (TextView) itemView.findViewById(R.id.tvStatus); 
      mDestinationTime = (TextView) itemView.findViewById(R.id.tvDestinationTime); 
      mDestination = (TextView) itemView.findViewById(R.id.tvDestination); 
     } 
    } 
} 

Моя раскладка Поезд Деталь определяется внутри Relative Layout 3 LinearLayouts:

<RelativeLayout 
android:id="@+id/rlTrainRoot" 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content"> 
<LinearLayout 
    android:id="@+id/llArrivalTime" 
    android:layout_width="60dp" 
    android:layout_height="60dp" 
    android:orientation="vertical" 
    android:layout_marginBottom="8dp" 
    android:layout_marginRight="15dp" 
    android:layout_marginEnd="15dp" 
    android:background="@color/ArrivalTimeGreen" 
    android:onClick="ArrivalTimeOnClickListener"> 

ответ

1

Вы можете tag ваш взгляд с position:

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    ... 
    holder.someClickableElement.setTag(position); 
    ... 
} 

Тогда в ArrivalTimeOnClickListener:

public void ArrivalTimeOnClickListener(View view) { 
    int position = (int) view.getTag(); 
    adapter.mTrains.get(position); // make mTrains public first, or provide getter 
    ... 
} 
0

Вы можете создать пользовательский интерфейс для обработки щелчка.

Посмотрите мой пример

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

public class TrainAdapter extends RecyclerView.Adapter<TrainAdapter.ViewHolder> { 
    private ArrayList<Train> mTrains; 
    private RecyclerViewClickListener mListener; 

    public TrainAdapter(Context context, ArrayList<Train> trains, RecyclerViewClickListener listener){ 
     mTrains = trains; 
     mListener = listener; 
    } 

....

public ViewHolder(final View itemView) { 
     super(itemView); 
     mArrivalTime = (TextView) itemView.findViewById(R.id.tvArrivalTime); 
     mPlatform = (TextView) itemView.findViewById(R.id.tvPlatform); 
     mTime = (TextView) itemView.findViewById(R.id.tvTime); 
     mStatus = (TextView) itemView.findViewById(R.id.tvStatus); 
     mDestinationTime = (TextView) itemView.findViewById(R.id.tvDestinationTime); 
     mDestination = (TextView) itemView.findViewById(R.id.tvDestination); 
     itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mListener.onItemClick(itemView, getAdapterPosition()); 
      } 
     }); 

.....

в классе:

trains.add(new Train("Artarmion Platform 3", 7, "On time", "Ahfield", "15:01")); 
trains.add(new Train("TEST", 97, "TEST", "TEST", "TEST")); 

trainAdapter = new TrainAdapter(this, trains, new RecyclerViewClickListener(){ 
    @Overide 
    void onItemClick(View view, int position){ 
     ArrivalTimeOnClickListener(view,position); 
    } 
});