Java 我需要一种解决以下IndexOutOfBoundsException的方法
我有一张单子。我为列表中的每个项目设置了cardview卡。我已在向上滑动时实现了删除,但当我删除最后一个项目(最后一张卡)时,将引发IndexOutOfBoundsException。 我的代码: 活动:Java 我需要一种解决以下IndexOutOfBoundsException的方法,java,android,list,indexoutofboundsexception,Java,Android,List,Indexoutofboundsexception,我有一张单子。我为列表中的每个项目设置了cardview卡。我已在向上滑动时实现了删除,但当我删除最后一个项目(最后一张卡)时,将引发IndexOutOfBoundsException。 我的代码: 活动: public class FirstPage extends Activity { RallyRestApi restApi; private RecyclerView recyclerView; private CustomAdapter adapter;
public class FirstPage extends Activity
{
RallyRestApi restApi;
private RecyclerView recyclerView;
private CustomAdapter adapter;
private List<MyData> data_list;
private Context mcontext;
String username;
String password;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_first_page);
mcontext=this;
recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
data_list = new ArrayList<>();
load_data();
recyclerView.setLayoutManager(new LinearLayoutManager(mcontext,LinearLayoutManager.HORIZONTAL,false));
adapter = new CustomAdapter(FirstPage.this,data_list);
recyclerView.setAdapter(adapter);
username=getIntent().getStringExtra("username");
password=getIntent().getStringExtra("password");
ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.UP )
{
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target)
{
Toast.makeText(getApplicationContext(), "on Move", Toast.LENGTH_SHORT).show();
return false;
}
@Override
public void onSwiped(final RecyclerView.ViewHolder viewHolder, int swipeDir)
{
Toast.makeText(getApplicationContext(), "Task Status changed to COMPLETE", Toast.LENGTH_LONG).show();
String username = getIntent().getStringExtra("username");
String password = getIntent().getStringExtra("password");
try
{
restApi=new RallyRestApi(new URI("https://rally1.rallydev.com"),username,password);
JsonObject updatedValues = new JsonObject();
updatedValues.addProperty("State", "Completed");
UpdateRequest taskUpdate = new UpdateRequest(data_list.get(viewHolder.getAdapterPosition()).getRef(), updatedValues);
restApi.update(taskUpdate);
data_list.remove(viewHolder.getAdapterPosition());
adapter.notifyDataSetChanged();
}
catch (URISyntaxException | IOException e)
{
e.printStackTrace();
}
}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(recyclerView);
}
公共类首页扩展活动
{
拉莱雷斯塔皮·雷斯塔皮;
私人回收站;
专用自定义适配器;
私有列表数据列表;
私有上下文;
字符串用户名;
字符串密码;
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(窗口。功能\u无\u标题);
setContentView(R.layout.activity\u第一页);
mcontext=这个;
recyclerView=(recyclerView)findViewById(R.id.recycler\u视图);
data_list=new ArrayList();
加载_数据();
setLayoutManager(新的LinearLayoutManager(mcontext,LinearLayoutManager.HORIZONTAL,false));
adapter=新的CustomAdapter(第一页,这是数据列表);
recyclerView.setAdapter(适配器);
username=getIntent().getStringExtra(“用户名”);
password=getIntent().getStringExtra(“密码”);
ItemTouchHelper.SimpleCallback simpleItemTouchCallback=新建ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.UP)
{
@凌驾
公共布尔onMove(RecyclerView RecyclerView、RecyclerView.ViewHolder ViewHolder、RecyclerView.ViewHolder目标)
{
Toast.makeText(getApplicationContext(),“移动中”,Toast.LENGTH_SHORT.show();
返回false;
}
@凌驾
公共空间(最终回收视图.视图持有者视图持有者,int swipeDir)
{
Toast.makeText(getApplicationContext(),“任务状态更改为完成”,Toast.LENGTH_LONG.show();
字符串username=getIntent().getStringExtra(“用户名”);
字符串密码=getIntent().getStringExtra(“密码”);
尝试
{
restApi=new-RallyRestApi(新URI(“https://rally1.rallydev.com)、用户名、密码);
JsonObject updatedValues=新的JsonObject();
updatedValues.addProperty(“状态”、“完成”);
UpdateRequest taskUpdate=new UpdateRequest(data_list.get(viewHolder.getAdapterPosition()).getRef(),updatedValues);
restApi.update(任务更新);
数据列表。删除(viewHolder.getAdapterPosition());
adapter.notifyDataSetChanged();
}
捕获(URISyntaxException | IOException e)
{
e、 printStackTrace();
}
}
};
ItemTouchHelper ItemTouchHelper=新的ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(recyclerView);
}
我的适配器类:
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {
private Context context;
private List<MyData> my_data;
FirstPage activity;
RallyRestApi restApi;
public CustomAdapter(FirstPage activity, List<MyData> my_data)
{
this.my_data = my_data;
this.activity=activity;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.card,parent,false);
itemView.setMinimumWidth(parent.getMeasuredWidth());
itemView.setMinimumHeight(parent.getMeasuredHeightAndState());
return new ViewHolder(itemView);
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position)
{
holder.userstory.setText("User Story: "+my_data.get(position).getUserstory());
holder.tasks.setText("Task: "+my_data.get(position).getTask());
holder.seekBar.setMax(my_data.get(position).getEstimate());
holder.seekBar.setProgress(my_data.get(position).getActual());
holder.actual_estimate.setText(my_data.get(position).getActual()+"/"+my_data.get(position).getEstimate());
holder.seekBar.setOnSeekBarChangeListener(new CircularSeekBar.OnCircularSeekBarChangeListener() {
@Override
public void onProgressChanged(CircularSeekBar circularSeekBar, int progress, boolean fromUser)
{
//IOB exception
holder.seekBar.setProgress(holder.seekBar.getProgress());
holder.actual_estimate.setText(holder.seekBar.getProgress()+"/"+my_data.get(position).getEstimate());
}
@Override
public void onStopTrackingTouch(CircularSeekBar seekBar)
{
try
{
restApi=new RallyRestApi(new URI("https://rally1.rallydev.com"),activity.username,activity.password);
JsonObject updatedValues = new JsonObject();
updatedValues.addProperty("Actuals", holder.seekBar.getProgress());
UpdateRequest taskUpdate = new UpdateRequest(my_data.get(position).getRef(), updatedValues);
restApi.update(taskUpdate);
holder.actual_estimate.setText(holder.seekBar.getProgress()+"/"+my_data.get(position).getEstimate());
holder.seekBar.setProgress(holder.seekBar.getProgress());
}
catch (URISyntaxException | IOException e)
{
e.printStackTrace();
}
}
@Override
public void onStartTrackingTouch(CircularSeekBar seekBar)
{
}
});
holder.seekBar.setProgress(holder.seekBar.getProgress());
holder.actual_estimate.setText(holder.seekBar.getProgress()+"/"+my_data.get(position).getEstimate());
}
@Override
public int getItemCount()
{
return my_data.size();
}
public class ViewHolder extends RecyclerView.ViewHolder
{
public TextView userstory,tasks,actual_estimate;
public CircularSeekBar seekBar;
//
public ViewHolder(View itemView)
{
super(itemView);
userstory=(TextView) itemView.findViewById(R.id.tvUserStory);
tasks=(TextView) itemView.findViewById(R.id.tvTask);
seekBar=(CircularSeekBar) itemView.findViewById(R.id.circularSeekBar1);
actual_estimate=(TextView) itemView.findViewById(R.id.tvactuals_estimate);
}
}
}
公共类CustomAdapter扩展了RecyclerView.Adapter{
私人语境;
私有列表我的_数据;
首页活动;
拉莱雷斯塔皮·雷斯塔皮;
公共CustomAdapter(第一页活动,列出我的\u数据)
{
this.my_data=my_data;
这个。活动=活动;
}
@凌驾
public ViewHolder onCreateViewHolder(视图组父级,int-viewType)
{
View itemView=LayoutInflater.from(parent.getContext()).flate(R.layout.card,parent,false);
itemView.setMinimumWidth(parent.getMeasuredWidth());
itemView.setMinimumHeight(parent.getMeasuredHeightAndState());
返回新的ViewHolder(itemView);
}
@凌驾
公共无效onBindViewHolder(最终视图持有人,最终整型位置)
{
holder.userstory.setText(“用户故事:+my_data.get(position.getUserstory());
setText(“任务:+my_data.get(position.getTask());
holder.seekBar.setMax(my_data.get(position.getEstimate());
holder.seekBar.setProgress(my_data.get(position.getActual());
holder.actual_estimate.setText(my_data.get(position).getActual()+“/”+my_data.get(position).getEstimate());
holder.seekBar.setOnSeekBarChangeListener(新的Circularsekbar.OnCircularsekbarChangeListener(){
@凌驾
public void onProgressChanged(CircularsekBar CircularsekBar,int progress,boolean fromUser)
{
//IOB例外
holder.seekBar.setProgress(holder.seekBar.getProgress());
holder.actual_estimate.setText(holder.seekBar.getProgress()+“/”+my_data.get(position.getEstimate());
}
@凌驾
TopTrackingTouch上的公共无效(循环Ekbar seekBar)
{
尝试
{
restApi=new-RallyRestApi(新URI(“https://rally1.rallydev.com“”,activity.username,activity.password);
JsonObject updatedValues=新的JsonObject();
updatedValues.addProperty(“Actuals”,holder.seekBar.getProgress());
UpdateRequest taskUpdate=新的UpdateRequest(my_data.get(position).getRef(),updatedValues);
restApi.update(任务更新);
holder.actual_estimate.setText(holder.seekBar.getProgress()+“/”+my_data.get(position.getEstimate());
holder.seekBar.setProgress(holder.seekBar.getProgress());
}
捕获(URISyntaxException | IOException e)
{
e、 printStackTrace();
}
}
@凌驾
开始跟踪触摸时的公共无效(循环Ekbar seekBar)
{
}
});
holder.seekBar.setProgress(holder.seekBar.getProgress());
holder.actual_estimate.setText(holder.seekBar.getProgress()+“/”+my_data.get(position.getEstimate());
}
@凌驾
public int getItemCount()
if(!data_list.isEmpty()){
data_list.remove(viewHolder.getAdapterPosition());
adapter.notifyDataSetChanged();
}
public void onBindViewHolder(final ViewHolder holder, final int position)
{
final SomeClass data = my_data.get(position);
holder.seekBar.setOnSeekBarChangeListener(new CircularSeekBar.OnCircularSeekBarChangeListener() {
@Override
public void onProgressChanged(CircularSeekBar circularSeekBar, int progress, boolean fromUser)
{
holder.seekBar.setProgress(holder.seekBar.getProgress());
holder.actual_estimate.setText(holder.seekBar.getProgress()+"/" + data.getEstimate());
}