Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
recyclerview onclicklistener java.lang.IndexOutOfBoundsException:索引0无效,大小为0_Java_Android_Android Activity_Adapter_Android Recyclerview - Fatal编程技术网

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);