12

RecyclerView私は少しの間遊んでいます。OnClickListenerにアイテムを入れる簡単な方法はありますRecyclerViewか? で実装してみましたViewHolderonClick イベントはトリガーされませんでした。

そして、私は にnotifyItemInserted(position)新しい価値を追加するために使用しましたRecyclerViewUI は自動的に更新されません。リフレッシュするには上下に引っ張る必要があります。しかし、私が呼び出すnotifyDatasetChanged(..)と、大丈夫です。

に応募DefaultItemAnimatorしましたRecyclerViewしかし、新しいアイテムが追加されたときにアニメーションが表示されません。

ご意見ありがとうございます。

これは私がテストした最初の Android L コンポーネントであり、そこにこだわっています。

ここに私のアダプタクラスがあります:

public class AdapterRecyclerView extends RecyclerView.Adapter<AdapterRecyclerView.MyViewHolder> {

private List<String> arrExperiences;

//Provide a reference to the type of views that you are using - Custom ViewHolder
public class MyViewHolder extends RecyclerView.ViewHolder {

    public TextView tvExperienceTitle;
    public TextView tvExperienceDesc;

    public MyViewHolder(RelativeLayout itemView) {
        super(itemView);
        tvExperienceTitle = (TextView) itemView.findViewById(R.id.tv_experience_title);
        tvExperienceDesc = (TextView) itemView.findViewById(R.id.tv_experience_desc);
    }

}

//Provide a suitable constructor : depending on the kind of dataset.
public AdapterRecyclerView(List<String> arrExperiences){
    this.arrExperiences = arrExperiences;
}

//Create new view : invoke by a Layout Manager
@Override
public AdapterRecyclerView.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    RelativeLayout view = (RelativeLayout) LayoutInflater.from(parent.getContext()).inflate(R.layout.view_item_recycler, parent, false);
    MyViewHolder myViewHolder = new MyViewHolder(view);
    return myViewHolder;
}

@Override
public void onBindViewHolder(AdapterRecyclerView.MyViewHolder viewHolder, int position) {
    //get element from your dataset at this position.
    //replace the content of the view with this element.
    viewHolder.tvExperienceTitle.setText(arrExperiences.get(position));
}

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

public void addExperience(String experience, int position){
    arrExperiences.add(position, experience);
    notifyItemInserted(position);
    //notifyDataSetChanged();
}

public void removeExperience(){
    int index = (int) (Math.random() * arrExperiences.size());
    arrExperiences.remove(index);
    notifyItemRemoved(index);
    //notifyDataSetChanged();
}
}
4

4 に答える 4

2

これをアダプターに追加するだけです:

@Override
public void onBindViewHolder(AdapterRecyclerView.MyViewHolder viewHolder, int position) {
    yourItems.setOnClickListener(new OnClickListener() {
       @Override
       public void onClick(View v) {
          //do your stuff
       }
   });
}
于 2016-05-23T21:28:33.313 に答える
0

ここで私の答えを見てください。追加のクラス (フル リリースの一部として含まれている可能性があります) が必要ですが、ListView に慣れている方法で OnItemClickListeners を作成できます。

于 2014-10-04T20:26:57.810 に答える
0

あなたはまだ正しい答えをマークしていないので、たとえそれが古い質問であっても、私は私のやり方を提供しようとします. とても清潔でプロフェッショナルだと思います。RecycleView を使用するすべてのアクティビティについて、機能はさまざまなブログ (ページで言及する必要があります) から取得され、統合され、速度とスケーラビリティのためにメソッドが改善されました。

https://github.com/davideas/FlexibleAdapter

  • 下位クラスには、選択機能を提供する SelectableAdapter があり、回転後に状態を維持できます。アクティビティから onSave/onRestore メソッドを呼び出すだけです。
  • 次に、クラス FlexibleAdapter は、アニメーションのサポートを使用してコンテンツを処理します (位置に対してのみ通知を呼び出します。注:アクティビティを作成するときに、アニメーションを RecyclerView に設定する必要があります)。
  • 次に、このクラスを再度拡張する必要があります。ここで、独自の ViewHolder とドメイン/モデル クラス (データ ホルダー) に対して必要に応じてメソッドを追加して実装します。注:プロジェクトにあるクラスでクラスを変更する必要があるため、コンパイルできない例を提供しました。

クリックのリスナーを保持する必要があるのは ViewHolder であり、Binding メソッドではなく作成時に実行する必要があると思います (notify...() からの無効化ごとに呼び出されます)。

また、このアダプターは基本的なクリック (シングル クリックとロング クリック) を処理することに注意してください。ダブル タップが必要な場合は、Jabob Tabak が回答で行う方法を使用する必要があります。

まだまだ改良が必要なので、見守っていてください。また、元に戻すなどの新しい機能をいくつか追加したいと考えています。

于 2015-05-04T08:59:41.927 に答える
0

ここでonItemClickは、 の各リスト行でイベントを実行できる単純な Adapter クラスを取得しますrecyclerview

于 2014-12-04T04:12:51.167 に答える