我正在尝试在1个提供程序(Content Provider)中开发2个应用程序,但是我编写的代码有问题,例如下面的脚本和logcat,我将NoteAdaper放在第一个应用程序中,以显示通过sqlite输入的数据,回收器视图,但是第一个或第二个应用程序无法显示输入的数据,是否有解决此问题的方法?
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)
来自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);
}