私のアプリケーションでは、スピナーとrecyclerViewがあります。スピナで選択されたアイテムに基づいて、異なるリストアイテムはとなり、recyclerViewに表示されます。recyclerViewを別のデータセットで複数回ロードしているときにエラーが発生しました
最初はスピナーのアイテム選択に基づいて、私はrecyclerViewで完全なデータを取得しています。
を例外:しかし4-5回はスピナーでデータを変更し、recyclerViewでcorrepondingリストを取得した後、私は自分のアプリケーションがダウンしてクラッシュして、次の例外を取得しています
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 0(offset:2).state:2
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5456)
マイコード:
ArrayAdapter<String> spinnerAdapter=new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item,dcuName);
dcuSpinner.setAdapter(spinnerAdapter);
final LinearLayoutManager llm = new LinearLayoutManager(getActivity());
slcList = (RecyclerView)v.findViewById(R.id.addedSlcList);
handleDCURequest = new handleDCURequest();
dcuSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, final View view, final int position, long id)
{
Query refQuery1 = ref.orderByChild("name").equalTo(dcuName.get(position));
refQuery1.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s)
{
slcList.getRecycledViewPool().clear();
Log.d("SpinnerAdd2", dataSnapshot.getKey());
dcuIDVal = dataSnapshot.getKey();
adapter = new FirebaseRecyclerAdapter<slcObject, viewHolder>(slcObject.class, R.layout.single_slc_row,
viewHolder.class,FirebaseDatabase.getInstance().getReference().child("JSON").child("StreetLightcontrol").child(dataSnapshot.getKey()).child("DeviceList")) {
@Override
protected void populateViewHolder(final viewHolder viewHolder, slcObject model, int position)
{
//expand collapse
//
viewHolder.vis.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
// ViewAnimationsUtils.expand(viewHolder.inv);
viewHolder.collapse.setVisibility(View.VISIBLE);
viewHolder.inv.setVisibility(View.VISIBLE);
}
});
viewHolder.collapse.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
// ViewAnimationsUtils.collapse(inv);
viewHolder.inv.setVisibility(View.GONE);
viewHolder.collapse.setVisibility(View.GONE);
}
});
final String slcIDVal= adapter.getRef(viewHolder.getAdapterPosition()).getKey();
viewHolder.name.setText(model.getName());
viewHolder.onOff.setClickable(false);
viewHolder.onOff.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
if(viewHolder.onOff.isChecked())
{
viewHolder.onOff.setChecked(false);
handleDCURequest.slc_onoff((Context)myContext,1, slcIDVal,dcuIDVal, viewHolder.onOff, viewHolder.dimming);
//Toast.makeText(myContext,"Turned On",Toast.LENGTH_LONG).show();
}
else
{
viewHolder.onOff.setChecked(true);
handleDCURequest.slc_onoff((Context)myContext,0, slcIDVal,dcuIDVal, viewHolder.onOff,viewHolder.dimming);
// Toast.makeText(myContext,"Turned Off",Toast.LENGTH_LONG).show();
}
}
});
viewHolder.dimming.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
int originalProgress;
@Override
public void onStopTrackingTouch(SeekBar seekBar)
{
if(seekBar.isShown()) {
viewHolder.dimming.setEnabled(false);
handleDCURequest.slc_dimming((Context) myContext, slcIDVal, seekBar.getProgress(), originalProgress, dcuIDVal, viewHolder.dimming);
//
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
originalProgress = seekBar.getProgress();
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if(viewHolder.getAdapterPosition()!=RecyclerView.NO_POSITION)
{
if(seekBar.isShown() && fromUser)
{
// progress= (progress/10)*10;
// //ProgressUtil.showProgressDialog(progressDialog);
// Log.d("Seek", String.valueOf(progress));
// viewHolder.dimming.setEnabled(false);
// handleDCURequest.slc_dimming((Context)myContext,slcIDVal,progress, originalProgress,dcuIDVal,viewHolder.dimming);
// //adapter.getRef(viewHolder.getAdapterPosition()).child("Percentage").setValue(progress);
//viewHolder.showProgress.setText(progress+"%");
}
}
}
});
viewHolder.edit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final Dialog dialog = new Dialog(myContext);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.update_slc);
dialog.setCancelable(false);
Window window = dialog.getWindow();
if (window == null) return;
WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.copyFrom(dialog.getWindow().getAttributes());
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
lp.gravity = Gravity.CENTER;
dialog.getWindow().setAttributes(lp);
final EditText name = (EditText) dialog.findViewById(R.id.slcNameu);
final EditText lat = (EditText) dialog.findViewById(R.id.slcLatu);
final EditText lng = (EditText) dialog.findViewById(R.id.slcLngu);
final EditText note = (EditText) dialog.findViewById(R.id.slcNoteu);
final EditText id = (EditText) dialog.findViewById(R.id.slcIDu);
TextView cancel = (TextView) dialog.findViewById(R.id.cancelu);
TextView update = (TextView) dialog.findViewById(R.id.updateSlc);
update.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String oldSlcIDVal= adapter.getRef(viewHolder.getAdapterPosition()).getKey();
Map mParent = new HashMap();
mParent.put("name",name.getText().toString());
mParent.put("lat",lat.getText().toString());
mParent.put("log",lng.getText().toString());
mParent.put("note",note.getText().toString());
//
}
});
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
dialog.dismiss();
}
});
}
});
viewHolder.delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
final Dialog dialog = new Dialog(myContext);
dialog.setTitle("Delete Slc?");
dialog.setContentView(R.layout.delete_slc);
dialog.setCancelable(false);
Window window = dialog.getWindow();
if(window == null) return;
WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.copyFrom(dialog.getWindow().getAttributes());
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
lp.gravity = Gravity.CENTER;
dialog.getWindow().setAttributes(lp);
TextView delete = (TextView)dialog.findViewById(R.id.deleteSlc);
final String key= adapter.getRef(viewHolder.getAdapterPosition()).getKey();
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
// int pos = viewHolder.getAdapterPosition();
Log.d("positionVal",viewHolder.getAdapterPosition()+"");
handleDCURequest.delete_slc((Context)myContext,slcIDVal,viewHolder.getAdapterPosition(), dcuIDVal,adapter);
dialog.dismiss();
}
});
TextView dialogButton = (TextView) dialog.findViewById(R.id.canceld);
// if button is clicked, close the custom dialog
dialogButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
dialog.dismiss();
}
});
dialog.show();
}
});
}
};
slcList.setLayoutManager(llm);
adapter.notifyDataSetChanged();
slcList.setAdapter(adapter);
}
こんにちは、ほとんどの場合、アダプターが起動した後、populateViewHolderはrecyclerViewアダプターのコードです。 –
この問題は非常に不安定です。その予期せぬことに、他の時代にはそこにはない。 –
そのようなことが普通ですが、私はリストの読み込みと再ロード時にList上で同様の問題が発生しています。アダプタデータをクリアしたことがないため、位置とデータが不安定です。あなたのRecycleViewではクリアしますが、最初の場所でRecleViewにデータを供給するSpinnerでは決して使用しないでください:call .clear();おそらく.notifyDataSetChanged(); .clear()を呼び出した後にデータをリロードするだけです。それがうまくいくなら、私の答えは、将来の参照のために受け入れてください。乾杯。 –