0
在我的应用程序中,我有一个微调框和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适配器的代码。 –
这个问题非常不稳定。它出人意料地在其他时间不在那里。 –
它通常是这样的,我有类似的问题之前列表加载和重新加载列表不断增加我从来没有清除适配器数据,因此位置和数据是不稳定的,我怀疑这个问题是相同的你的情况,我已经指出你只是打电话在您的RecycleView上清除,但从不在第一次提供数据到RecleView的Spinner上:尝试调用.clear();并可能.notifyDataSetChanged();或者在调用.clear()之后执行数据重新加载。如果它有任何作品,请接受我的答案,以备将来参考以及面临类似问题的其他人。干杯。 –