Android 使用不同的数据集多次加载recyclerView时出错
在我的应用程序中,我有一个微调器和一个回收视图。根据微调器中选择的项目,recyclerView中将显示不同的项目列表 最初基于微调器上的项目选择,我在recyclerView中获得了完美的数据。但是,在微调器中更改了4-5次数据并在recyclerView中获取了对应列表后,我的应用程序崩溃,出现以下异常: 例外情况: 我的代码:Android 使用不同的数据集多次加载recyclerView时出错,android,android-recyclerview,android-seekbar,Android,Android Recyclerview,Android Seekbar,在我的应用程序中,我有一个微调器和一个回收视图。根据微调器中选择的项目,recyclerView中将显示不同的项目列表 最初基于微调器上的项目选择,我在recyclerView中获得了完美的数据。但是,在微调器中更改了4-5次数据并在recyclerView中获取了对应列表后,我的应用程序崩溃,出现以下异常: 例外情况: 我的代码: 您的代码太长,可能需要将其分成若干块,但根据您得到的解释和异常:- 说明:最初基于微调器上的项目选择,I 我在recyclerView中获得了完美的数据。但是4-5
您的代码太长,可能需要将其分成若干块,但根据您得到的解释和异常:- 说明:最初基于微调器上的项目选择,I 我在recyclerView中获得了完美的数据。但是4-5次之后 更改微调器中的数据 异常:IndexOutOfBoundsException 这完美地表明您的RecycleView无法再填充数据,传递给它的引用不在已分配的数据绑定范围内。例如,您拥有的数据是20,但传递的引用是25 我建议您使用Log.dData、data.size;要锁定实际数据大小,或使用断点或重构代码,以便我们可以轻松锁定它:
注意。Hi,大多数情况下在适配器启动后,populateViewHolder中是recyclerView适配器的代码。此问题非常不稳定。它出人意料地出现,而其他时候它不在那里。通常情况下,我以前在列表上有类似的问题。加载和重新加载列表时,列表不断增长,我从未清除适配器数据,因此位置和数据不稳定,我怀疑问题与您的情况相同,我已经指出您只在RecycleView上调用clear,而从不在第一个位置向RecleView提供数据的微调器上调用clear:Try call.clear;而且很可能是这样的;或者在调用后重新加载数据。清除。如果有任何效果,请接受我的回答,以供将来参考和其他面临类似问题的人参考。干杯
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);
}