getAdapterPosition()不返回RecyclerView中项目的位置

时间:2015-06-19 21:51:59

标签: android android-support-library android-recyclerview android-cardview

这是对this post的一种跟进或补充。我想在我的RecyclerView中找到一个项目的位置,但我尝试过的方法都没有。

我在 *Case #1 10 20 X X XXX *Case #2: Shape 7 7 XX XX X 构造函数中调用getAdapterPosition()并将其值分配给整数位置,该位置在PersonViewHolder类中用于相应地执行某些操作(请参阅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();
    }
}

我的代码似乎很明显,但是如果有什么令人困惑的话,请告诉我,我会添加更多信息。再一次,问题是我无法在RecyclerView中获取该项目的位置,然后对其采取行动。

3 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:0)

我是否可以使用viewHolder.mView.setOnClickListener()获取点击事件,然后使用viewHolder.getAdapterPosition ()获取该位置。如何从我点击的项目中获取一些数据,例如名称。

示例complet:

https://pastebin.com/TuKTchNi

答案 2 :(得分:0)

private func checkPatientPdfIsPresentOrNot(selectedPatient: String) -> Bool {
    let fileManager = FileManager.default
    do {
        let documentsURL = try fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
        let fileURLs = try fileManager.contentsOfDirectory(at: documentsURL, includingPropertiesForKeys: [.nameKey], options: .skipsHiddenFiles)
        return fileURLs.first(where: { url -> Bool in
            let fileName = url.deletingPathExtension().lastPathComponent
            return fileName.components(separatedBy: "_").first == selectedPatient.capitalized
        }) != nil
        
    } catch { print(error); return false }
}