web-dev-qa-db-ja.com

リサイクラービューでOnClickListenerをどのように使用しますか?

私が基本的にやろうとしているのは、リストのアルバムカバーとその横にタイトルを表示するプログラムを作成しているため、リサイクラービューに表示されるオブジェクトを特定のTextViewIDにクリック可能にすることです。リサイクラービューが作成する各ボックスをクリックし、クリックしたときに他の情報(作成者、公開日、ヒット曲など)を含むTextViewをポップアップさせてから、戻るボタンを表示できるようにする必要があります(可能)アルバムリストに戻る。私はこれを何時間も見てきましたが、OnclickListenerを機能させる方法がわかりません。あなたが方法を知っているか、何か提案があれば、それらを聞いてうれしいです。ありがとうございました!

package com.albumlist.albumlist;

import Android.content.Context;
import Android.content.Intent;
import Android.support.v7.widget.RecyclerView;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.ImageView;
import Android.widget.TextView;
import Android.widget.Toast;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private AlbumData[] itemsData;

    public MyAdapter(AlbumData[] itemsData){
        this.itemsData = itemsData;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        private TextView txtViewTitle;
        private ImageView imgViewIcon;

        public ViewHolder(View itemLayoutView) {
            super(itemLayoutView);
            itemLayoutView.setOnClickListener(this);
            txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.album_title);
            imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.album_icon);
        }

        @Override
        public void onClick(View v) {

        }
    }

    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {

        View itemLayoutView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.data_layout, null);

        ViewHolder viewHolder = new ViewHolder(itemLayoutView);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int position) {

        viewHolder.txtViewTitle.setText(itemsData[position].getTitle());
        viewHolder.imgViewIcon.setImageResource(itemsData[position].getImageUrl());
    }

    @Override
    public int getItemCount() {
        return itemsData.length;
    }

}
10
brandin

コンセプトはコメントの中でXaver Kapellerによってよく要約されています。 RecyclerViewの従来のインタラクションと同様のListViewインタラクションを管理する簡単な方法を探している場合は、GitHubの BigNerdRanchのrecyclerview-multiselect ライブラリを確認してください。探索できるサンプルアプリがあり、複数選択の機能が追加された一連のOnClickListenersOnLongClickListenersを実装しています。

これは、BigNerdRanchがFragmentAdapterにまたがるViewHolderにリスナーを実装する方法のスニペットです。この場合、これは実際にはライブラリ自体のSwappingHolder.の拡張です。

public CrimeHolder(View itemView) {
        super(itemView, mMultiSelector);

        mTitleTextView = (TextView) itemView.findViewById(R.id.crime_list_item_titleTextView);
        mDateTextView = (TextView) itemView.findViewById(R.id.crime_list_item_dateTextView);
        mSolvedCheckBox = (CheckBox) itemView.findViewById(R.id.crime_list_item_solvedCheckBox);
        itemView.setOnClickListener(this);
        itemView.setLongClickable(true);
        itemView.setOnLongClickListener(this);
    }

    public void bindCrime(Crime crime) {
        mCrime = crime;
        mTitleTextView.setText(crime.getTitle());
        mDateTextView.setText(crime.getDate().toString());
        mSolvedCheckBox.setChecked(crime.isSolved());
    }

    @Override
    public void onClick(View v) {

        if (mCrime == null) {
            return;
        }
        if (!mMultiSelector.tapSelection(this)) {
            selectCrime(mCrime);
        }

    }


    @Override
    public boolean onLongClick(View v) {

        ((AppCompatActivity) getActivity()).startSupportActionMode(mDeleteMode);
        mMultiSelector.setSelected(this, true);
        return true;
    }


}


private class CrimeAdapter extends RecyclerView.Adapter<CrimeHolder> {
    @Override
    public CrimeHolder onCreateViewHolder(ViewGroup parent, int pos) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_item_crime, parent, false);
        return new CrimeHolder(view);
    }

    @Override
    public void onBindViewHolder(CrimeHolder holder, int pos) {
        Crime crime = mCrimes.get(pos);
        holder.bindCrime(crime);
        Log.d(TAG, "binding crime" + crime + "at position" + pos);
    }

    @Override
    public int getItemCount() {
        return mCrimes.size();
    }
}
4
AlleyOOP