web-dev-qa-db-ja.com

getAdapterPosition()がRecyclerViewでアイテムの位置を返さない

これは、 この投稿 の一種のフォローアップまたは補足です。 RecyclerViewでアイテムの位置を取得しようとしていますが、試した方法がどれも機能しませんでした。

PersonViewHolderコンストラクターでgetAdapterPosition()を呼び出し、その値を整数位置に割り当てました。整数位置は、それに応じて何かを行うためにUnitOneFragmentクラスで使用されます(onClick()を参照)。方法)。しかし、それが何であれ、それは起こりません。私の推測では、getAdapterPosition()メソッドが機能しないか、正しく使用されていません。

私のアダプター:

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.PersonViewHolder> {

Context mContext;

RVAdapter(Context context, List<Chapter> chapters) {
    mContext = context;
    this.chapters = chapters;
}

public static CardView cv;
public static int position;
public static String chapterNumberTitle;

public class PersonViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    TextView chapterName;
    TextView chapterNumber;
    // ImageView chapterPhoto;

    public PersonViewHolder(View itemView) {
        super(itemView);

        cv = (CardView) itemView.findViewById(R.id.cv);
        chapterName = (TextView) itemView.findViewById(R.id.chapter_name);
        chapterNumber = (TextView) itemView.findViewById(R.id.chapter_number);
        // chapterPhoto = (ImageView) itemView.findViewById(R.id.person_photo);

        chapterNumberTitle = chapterNumber.getText().toString();
        position = getAdapterPosition();

        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        UnitOneFragment.chapterChecker();

        Intent intent = new Intent(mContext, ChapterActivity.class);
        mContext.startActivity(intent);
    }
}

List<Chapter> chapters;

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
}

@Override
public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
    PersonViewHolder pvh = new PersonViewHolder(v);
    return pvh;
}

@Override
public void onBindViewHolder(PersonViewHolder personViewHolder, int i) {
    personViewHolder.chapterName.setText(chapters.get(i).chapterName);
    personViewHolder.chapterNumber.setText(chapters.get(i).chapterNumber);
    // personViewHolder.chapterPhoto.setImageResource(persons.get(i).photoId);

}

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

他のクラス:

public class UnitOneFragment extends Android.support.v4.app.Fragment {

private List<Chapter> chapters;
private RecyclerView rv;
private RecyclerView.LayoutManager llm;

public UnitOneFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View v = inflater.inflate(R.layout.fragment_unit_one, container, false);

    getActivity().setTitle("Unit One");

    rv = (RecyclerView) v.findViewById(R.id.rv);
    rv.setHasFixedSize(true);

    llm = new LinearLayoutManager(getActivity());
    rv.setLayoutManager(llm);

    initializeData();
    initializeAdapter();

    return v;
}

private void initializeData() {
    chapters = new ArrayList<>();
    chapters.add(new Chapter("Human Prehistory to the Early Civilizations", "Chapter One"));
    chapters.add(new Chapter("Classical China", "Chapter Two"));
    chapters.add(new Chapter("Classical India", "Chapter Three"));
    chapters.add(new Chapter("Classical Greece and Rome", "Chapter Four"));
    chapters.add(new Chapter("Classical Period: Declines and Diversities", "Chapter Five"));
}

private void initializeAdapter() {
    RVAdapter adapter = new RVAdapter(getActivity(), chapters);
    rv.setAdapter(adapter);
}

public static void chapterChecker() {

    if (RVAdapter.position == 0) {
        SummaryFragment.summaryText.setText("Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the Word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of \"de Finibus Bonorum et Malorum\" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of Ethics, very popular during the Renaissance. The first line of Lorem Ipsum, \"Lorem ipsum dolor sit amet..\", comes from a line in section 1.10.32.");
        }
    }
}

class Chapter {
String chapterName;
String chapterNumber;
// int photoId;

Chapter(String chaptername, String chapternumber) {
    this.chapterName = chaptername;
    this.chapterNumber = chapternumber;
    // this.photoId = photoId;
    }
}

私のコードはかなり自明のようですが、何か紛らわしいことがあれば、私に知らせてください。さらに情報を追加します。繰り返しになりますが、問題は、RecyclerViewでアイテムの位置を取得して、それを操作できないことです。

8
wasimsandhu

getAdapterPosition()メソッドでonClick()を呼び出します。クリックしたときに、アイテムの位置を知りたいからです。作成時にチェックすると、(ほとんどの場合)不正確になります。

15
EE66

viewHolder.mView.setOnClickListener()を使用してクリックイベントを取得してからviewHolder.getAdapterPosition ()を使用して位置を取得できますか?クリックしているアイテムから名前などのデータを取得するにはどうすればよいですか。

ここで完了例:

https://Pastebin.com/TuKTchNi

0
Renato Souza