调用 arraylist 中的一项时索引越界异常

index out of bound exeception when call one item in arraylist

我想获取数组列表中的一项,但出现错误 java.lang.IndexOutOfBoundsException:索引 1 无效,大小为 0 我称之为 listEvent.get(1).getTotal() 其中 listEvent 是我的 arraylist 我如何从 arraylist 中检索元素?

这是我的代码

 private void getData() {
        //Adding the method to the queue by calling the method getDataFromServer

        requestQueue.add(getDataFromServer(requestCount));
        //Incrementing the request counter

        if(requestCount <= **listEvent.get(1).getTotal()**) {
            requestCount++;
        }
    }

这是我的完整代码

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.anakacara.anakacara.App.AppConfig;
import com.anakacara.anakacara.App.Event;
import com.anakacara.anakacara.Helper.CardAdapter;
import com.anakacara.anakacara.R;
import com.anakacara.anakacara.activity.DetailEvent;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

/**
 * A simple {@link Fragment} subclass.
 * Activities that contain this fragment must implement the
 * {@link EventFragment.OnFragmentInteractionListener} interface
 * to handle interaction events.
 * Use the {@link EventFragment#newInstance} factory method to
 * create an instance of this fragment.
 */
public class EventFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {
    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;

    //Creating a List of event
    private List<Event> listEvent;

    //Creating Views
    private RecyclerView recyclerView;
    private RecyclerView.LayoutManager layoutManager;
    private RecyclerView.Adapter adapter;
    private int requestCount = 1;
    private OnFragmentInteractionListener mListener;
    private RequestQueue requestQueue;
    private ProgressBar progressBar;
    private SwipeRefreshLayout swipeRefreshLayout;
    public EventFragment() {
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment EventFragment.
     */
    // TODO: Rename and change types and number of parameters
    public static EventFragment newInstance(String param1, String param2) {
        EventFragment fragment = new EventFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

    private final RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(final RecyclerView recyclerView, final int newState) {
            // code
            if (isLastItemDisplaying(recyclerView)) {
                //Calling the method getdata again
                getData();
            }
        }

        @Override
        public void onScrolled(final RecyclerView recyclerView, final int dx, final int dy) {
            // code
            if (isLastItemDisplaying(recyclerView)) {
                //Calling the method getdata again
                getData();
            }
        }
    };
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View x =  inflater.inflate(R.layout.fragment_event,null);;
        progressBar = (ProgressBar) x.findViewById(R.id.progressBar1);
        recyclerView = (RecyclerView) x.findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(layoutManager);
        swipeRefreshLayout = (SwipeRefreshLayout) x.findViewById(R.id.swipeRefreshLayout);
        swipeRefreshLayout.setOnRefreshListener(this);

        /**
         * Showing Swipe Refresh animation on activity create
         * As animation won't start on onCreate, post runnable is used
         */
        swipeRefreshLayout.post(new Runnable() {
                                    @Override
                                    public void run() {
                                        swipeRefreshLayout.setRefreshing(true);

                                        getData();
                                    }
                                }
        );




        //Initializing our event list
        listEvent = new ArrayList<>();
        requestQueue = Volley.newRequestQueue(getActivity());
        //Calling method to get data
        getData();

//        swipeRefreshLayout= (SwipeRefreshLayout) x.findViewById(R.id.swipeRefreshLayout);
//        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener()
//        {
//            @Override
//            public void onRefresh()
//            {
//                if (isLastItemDisplaying(recyclerView)) {
////Calling the method getdata again
//                    getData();
//                    progressBar.setVisibility(View.GONE);
//                }
//            }
//        });
        recyclerView.addOnScrollListener(rVOnScrollListener);
        adapter = new CardAdapter(listEvent, getActivity());

        //Adding adapter to recyclerview
        recyclerView.setAdapter(adapter);
        RecyclerView.ItemAnimator itemAnimator = new DefaultItemAnimator();
        itemAnimator.setAddDuration(1000);
        itemAnimator.setRemoveDuration(1000);
        recyclerView.setItemAnimator(itemAnimator);
        recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), recyclerView, new ClickListener() {
            @Override
            public void onClick(View view, int position) {
                Intent intent = new Intent(getActivity(), DetailEvent.class);
                intent.putExtra("event_judul", listEvent.get(position).getJudul()); //you can name the keys whatever you like
                intent.putExtra("event_deskripsi", listEvent.get(position).getDeskripsi()); //note that all these values have to be primitive

这是我的 json 代码

0:  {
"id": 5
"judul": "asdfasdfasdf"
"deskripsi": "asfasdfasdfqwer"
"duit": 123123
"persen": 65
"sisahari": 43
"gambar": "http://192.168.0.13/task_manager/image/not4.jpeg"
"total": 4
}-
1:  {
"id": 4
"judul": "asdfasfasdfas"
"deskripsi": "dafasdfasdfasdfasfdasdf"
"duit": 12341234
"persen": 12
"sisahari": 31
"gambar": "http://192.168.0.13/task_manager/image/not3.jpeg"
"total": 4
}

我需要访问总数但是因为在数组 0 和 1 中它是相同的我只需要访问其中一个 我想使用这样的代码 如果(请求数 <= 4){ 请求计数++; } 这是 4 是页数限制,但我想从数组中获取它,所以它将是动态的而不是像这样手动的

错误说明您正试图访问数组列表中的一个空位置。
如果你想访问 arraylist 的位置 1,你可以在尝试访问该位置的值之前以这种方式进行检查,这将确保你的应用程序不会崩溃:

if(listEvent.size() > 1 && requestCount <= listEvent.get(1).getTotal())

它清楚地表明您正在尝试访问 List 中不存在任何元素的第二个元素。 您应该在访问列表之前检查列表的大小。 您可以如下查看:

if(listEvent.size()>= 2 && requestCount <= listEvent.get(1).getTotal())    {
        requestCount++;
    }

PS:

我假设通过使用 .get(1) 您打算访问第二个元素。 如果你想访问第一个元素,你应该使用** .get(0)** 代替。