recyclerview onclicklistener java.lang.IndexOutOfBoundsException:索引0无效,大小为0
当我动态删除一个项目,或刷新适配器(滑动到“刷新”)时,我会出现以下错误:recyclerview onclicklistener java.lang.IndexOutOfBoundsException:索引0无效,大小为0,java,android,android-activity,adapter,android-recyclerview,Java,Android,Android Activity,Adapter,Android Recyclerview,当我动态删除一个项目,或刷新适配器(滑动到“刷新”)时,我会出现以下错误: recyclerview onclicklistener java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 真的不明白为什么会这样,真的很感谢你的反馈 主要活动: adapter.setOnItemClickListener(new OnItemClickListener() { @Override
recyclerview onclicklistener java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
真的不明白为什么会这样,真的很感谢你的反馈
主要活动:
adapter.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
GroupModel selectedList = mGroupModels.get(position);
if (selectedList != null) {
Log.d(TAG, "setAdpterListner > view.getId: " + view.getId() +
" | P: " + position +
" | data ID: " + selectedList.getGroupName()
//" | viewID: " + viewID
);
Intent intent = new Intent(this, DetailsActivity.class);
String listId = selectedList.getGroupID();
String listName = selectedList.getGroupName();
intent.putExtra(Constant.KEY_LIST_ID, listId);
intent.putExtra(Constant.KEY_LIST_NAME, listName);
startActivity(intent);
}
}
});
适配器:
public class GroupListAdapter extends RecyclerView.Adapter<GroupListAdapter.StatusViewHolder> {
Context context;
private List<GroupModel> mGroupModels;
private static OnItemClickListener listener;
public GroupListAdapter(Context context, List<GroupModel> groupList) {
this.context = context;
this.mGroupModels = groupList;
}
public void setOnItemClickListener(OnItemClickListener listener) {
GroupListAdapter.listener = listener;
}
@Override
public StatusViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_group_list, parent, false);
return new StatusViewHolder(view);
}
@Override
public void onBindViewHolder(StatusViewHolder holder, int position) {
final GroupModel data = mGroupModels.get(position);
holder.text_view_list_name.setText(data.getGroupName());
}//end onBindViewHolder
@Override
public int getItemCount() {
return mGroupModels.size();
}
public class StatusViewHolder extends RecyclerView.ViewHolder {
public TextView text_view_list_name;
public TextView created_by;
public StatusViewHolder(final View itemView) {
super(itemView);
text_view_list_name = (TextView) itemView.findViewById(R.id.text_view_list_name);
created_by = (TextView) itemView.findViewById(R.id.created_by);
// Setup the click listener
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null)
listener.onItemClick(itemView, getLayoutPosition());
}
});
}
}//end StatusViewHolder
}//end GroupListAdapter
在API调用中
...
GroupModel groupModel = new GroupModel(groupID, groupName, groupCreatedBy);
mGroupModels.add(groupModel);
}
updateUI(true);
if (adapter == null) {
adapter = new GroupListAdapter(MainActivity.this, mGroupModels);
mRecyclerView.setAdapter(adapter);
setAdapterListener(adapter);
}
使
OnItemClickListener
非静态。如
private OnItemClickListener listener;
问题肯定不在静态侦听器中。而且侦听器只是一个接口回调(与上面的注释相关),而不是AdapterView.OnItemClickListener()。我想问题出在这个代码后面的某个地方,也许你正在清除其他地方或类似的项目列表?
对于我来说,在你的例子中,最好使用getAdapterPosition()而不是getLayoutPosition()。 如文件所述: 如果LayoutManager需要调用需要项的适配器位置的外部方法,则可以使用getAdapterPosition()或RecyclerView.Recycler.convertPreLayoutPositionToPostLayout(int)
你的代码有很多问题 我将解释我处理回收视图的方法 非常简单的适配器
package com.pentavalue.ongo.transportway.adapter;
import android.app.Activity;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import com.pentavalue.ongo.R;
import com.pentavalue.ongo.Utilts.ImageLoaderHelper;
import com.pentavalue.ongo.register.model.Vechiles;
import com.pentavalue.ongo.widget.ArabicTextView;
import java.util.ArrayList;
/**
* Created by hamada on 19/09/2015.
*/
public class TransportTypeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public LayoutInflater inflater = null;
Activity activity;
ArrayList<Vechiles> vechileList;
ImageLoaderHelper imageLoaderHelper;
public TransportTypeAdapter(Activity activity, ArrayList<Vechiles> vechileList) {
this.activity = activity;
this.vechileList = vechileList;
imageLoaderHelper = new ImageLoaderHelper(activity, null);
inflater = LayoutInflater.from(activity);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View vi = inflater.inflate(R.layout.single_transport_item, parent, false);
RecyclerView.ViewHolder vh = new VechileListHolder(vi);
return vh;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int pos) {
VechileListHolder mHolder = (VechileListHolder) viewHolder;
mHolder.renderDate(vechileList.get(pos));
}
@Override
public int getItemCount() {
if (vechileList != null)
return this.vechileList.size();
else
return 0;
}
public class VechileListHolder extends RecyclerView.ViewHolder implements
View.OnClickListener {
ArabicTextView vecName;
RelativeLayout img_layout;
ProgressBar progress;
ImageView imgView;
public VechileListHolder(View vi) {
super(vi);
vi.setOnClickListener(this);
img_layout = (RelativeLayout) vi.findViewById(R.id.img_layout);
vecName = (ArabicTextView) vi.findViewById(R.id.TVVecName);
progress = (ProgressBar) vi.findViewById(R.id.progress);
imgView = (ImageView) vi.findViewById(R.id.imgView);
}
public void renderDate(Vechiles item) {
imageLoaderHelper.loadImage(imgView, progress, item.getImg());
vecName.setText(item.getVecName());
}
@Override
public void onClick(View v) {
if (mItemClickListener != null)
mItemClickListener.onItemClickListener(getPosition(), v);
}
}
public void setOnItemClickListener(ItemClickListener itemClick) {
this.mItemClickListener = itemClick;
}
public ItemClickListener mItemClickListener;
public interface ItemClickListener {
public void onItemClickListener(int pos, View v);
}
public void updateList(ArrayList<Vechiles> vechileList) {
this.vechileList = vechileList;
notifyDataSetChanged();
}
public void removeItem(int pos){
this.vechileList.remove(pos);
notifyItemRemoved(pos);
}
}
然后,在从API返回数据之后,可以使用update方法用新数据更新适配器
((VechileListHolder ) listView.getAdapter).updateList( vechileList);
如果使用adapter removeItem(Pos)中的Pos can do调用方法删除任何项目
希望此代码对您有所帮助您确定使用
AdapterView.OnItemClickListener
listener吗,因为onItemClick
方法需要4个参数,但在发布的代码中只有2个参数是通过的。如果您能提供一个简短的解释,说明为什么此建议可以解决问题,则会使您的答案对用户更有价值谢谢你的反馈。我更新代码。我想问题出在SwipeToFreshIt的安静奇怪,我已经在我的设备上检查了这个案例-它没有引起任何问题。但是为什么要在刷新回调中使视图无效?另外,清除项目列表并调用notifyDataSetChanged()不是更好吗?当我刷OfResh时,似乎有一个延迟。列表仍在显示中。如果我快速按下它。在它重新加载新数据之前。它会崩溃。所以,我看不到什么解决办法。如果API中的调用只是发出回调,那么您可以清除适配器的数据,notifyDataSetChanged()并在回调中设置新项。或者你可以做不可点击的查看技巧-但第一种解决方案更好,对我来说。你也可以保持数据原样,不清除任何内容,但在回调后-只通知受影响的范围。
initListView();
}
private void initRecycleView(){
listView = (RecyclerView) v.findViewById(R.id.listView);
listView.getItemAnimator().setAddDuration(1000);
listView.getItemAnimator().setChangeDuration(1000);
listView.getItemAnimator().setMoveDuration(1000);
listView.getItemAnimator().setRemoveDuration(1000);
listView.setLayoutManager(new GridLayoutManager(getActivity(), 3));
listView.setAdapter(new TransportTypeAdapter(getActivity(), vecList));
}
((VechileListHolder ) listView.getAdapter).updateList( vechileList);
((VechileListHolder ) listView.getAdapter).removeItem(1);