【问题标题】:error java.lang.IllegalStateException: Position invalid错误 java.lang.IllegalStateException:位置无效
【发布时间】:2020-05-25 09:37:10
【问题描述】:

我正在尝试在 1 个提供者(Content Provider)中开发 2 个应用程序,但是我编写的代码中存在问题,例如下面的脚本和 logcat,我将 NoteAdaper 放在第一个应用程序中以显示通过 sqlite 输入的数据使用recycler view,但第一个或第二个应用程序无法显示输入的数据,有没有解决这个问题的方法?

public class NoteAdapter extends RecyclerView.Adapter<NoteAdapter.NoteViewHolder> {
private Cursor listNotes;
private Activity activity;

public NoteAdapter(Activity activity){
    this.activity = activity;
}

public void setListNote(Cursor listNotes) {
    this.listNotes = listNotes;
}

@Override
public NoteViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_note, parent,false);
    return new NoteViewHolder(view);
}

@Override
public void onBindViewHolder(NoteViewHolder holder, int position) {
    final Note note = getItem(position);
    holder.tvTitle.setText(note.getTitle());
    holder.tvDescription.setText(note.getDescription());
    holder.tvDate.setText(note.getDate());
    holder.cvNote.setOnClickListener(new CustomOnItemClickListener(position, new CustomOnItemClickListener.OnItemClickCallback() {
        @Override
        public void onItemClicked(View view, int position) {
            Intent intent = new Intent(activity, FormAddUpdateActivity.class);

            Uri uri = Uri.parse(CONTENT_URI+"/"+note.getId());
            intent.setData(uri);
            activity.startActivityForResult(intent,FormAddUpdateActivity.REQUEST_UPDATE);
        }
    }));
}

@Override
public int getItemCount() {
    if(listNotes == null) return 0;
    return listNotes.getCount();
}

private Note getItem(int position){
    if (listNotes.moveToPosition(position)){
        throw new IllegalStateException("Position invalid");
    }
    return new Note(listNotes);
}

class NoteViewHolder extends RecyclerView.ViewHolder{
    TextView tvTitle, tvDescription, tvDate;
    CardView cvNote;

    NoteViewHolder(View itemView){
        super(itemView);
        tvTitle = (TextView)itemView.findViewById(R.id.tv_item_title);
        tvDescription = (TextView)itemView.findViewById(R.id.tv_item_description);
        tvDate = (TextView)itemView.findViewById(R.id.tv_item_date);
        cvNote = (CardView)itemView.findViewById(R.id.cv_item_note);
    }
}
}

Logcat:

java.lang.IllegalStateException: 位置无效 在 com.project.ichwan.provider.adapter.NoteAdapter.getItem(NoteAdapter.java:68) 在 com.project.ichwan.provider.adapter.NoteAdapter.onBindViewHolder(NoteAdapter.java:44) 在 com.project.ichwan.provider.adapter.NoteAdapter.onBindViewHolder(NoteAdapter.java:24) 在 androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7065) 在 androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7107) 在 androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6012) 在 androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6279)

【问题讨论】:

  • 你调试过你的代码吗?如果是,那么您观察到了什么?

标签: java android sqlite android-recyclerview


【解决方案1】:

来自 Cursor.moveToPosition 文档

如果请求目的地可达,该方法将返回true,否则返回false。

看起来你应该反转 listNotes.moveToPosition(position):

private Note getItem(int position){
    if (!listNotes.moveToPosition(position)){
        throw new IllegalStateException("Position invalid");
    }
    return new Note(listNotes);
}

【讨论】:

    猜你喜欢
    • 2017-12-09
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多