getAdapterPosition()方法在RecyclerView中无法返回项目的位置

9
这是对这篇文章的跟进或补充。我试图获取RecyclerView中一个项目的位置,但我尝试过的所有方法都没有成功。
我在我的PersonViewHolder构造函数中调用了getAdapterPosition(),并将其值分配给名为position的整数变量。在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中项目的位置,然后对其进行操作。

3个回答

15

在您的onClick()方法中调用getAdapterPosition(),因为在点击时您想要知道项目的位置。如果您在创建时间检查它,那么它(大多数情况下)会不准确。


5
你能提供一些代码并展示给我看吗? - wasimsandhu
4
@tieorange: 这个链接的要点显示页面未找到。请更新正确的链接以便于我们使用。 - Madhan

1
可以使用 viewHolder.mView.setOnClickListener() 获取点击事件,然后使用 viewHolder.getAdapterPosition() 获取位置。如何获取我正在单击的项中的一些数据,例如名称?请看以下完整示例:

https://pastebin.com/TuKTchNi


你能否解释一下你的代码?仅仅使用代码片段而不知道它是如何工作的并不能真正帮助任何人。请编辑你的回答,而不是在下面写评论。 - Aemyl

0
@Override
public void onBindViewHolder(@NonNull CourseVideoAdapter.MyViewHolder holder, int position) {

      holder.layout.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            //Write below line in your Adapter code
            currentPosition = holder.getAdapterPosition();
         }
      });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接