2016-08-31 7 views
1

これが畳み込まれていると申し訳ありません...ビューを使用してアダプタからインデックスを取得するにはどうすればよいですか?

私はリサイクラービューアダプターの値をクリックするとその値を更新する非同期タスクを作成しようとしています。私の問題は、RecyclerView行のonClickに返されているビューから、列LiastArrayから特定の行を取得できないことです。

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

基本的にプラットフォーム、到着時間、目的地などのゲッターとセッターを持つTrainクラスがあります。私は、列車のクラスのArrayListのでアダプタを設定し、ルアンで私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); 
     } 
    } 
} 

私の列車の項目のレイアウトがありますあなたは、そのpositionであなたのビューをtagでき

<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

:3 LinearLayoutsと相対レイアウト内で定義された

@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

あなたはクリックを処理するためのカスタムインタフェースを作成することができます。

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

は私の例

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

.....

見て

関連する問題