0

我想获取数组列表中的一个项目,但它给了我错误java.lang.IndexOutOfBoundsException:索引1无效,大小为0 我把这个listEvent.get(1 ).getTotal()其中listEvent是我的arraylist 我如何从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它是同样我只需要访问其中之一 我想使用这样的代码 if(requestCount < = 4){request_ount ++; } 这是4是页面限制,但我想从数组中获得它,所以它将是动态的,而不是像这样的手动

回答

2

错误描述了您正在尝试访问空列的arraylist位置。
如果您要访问的ArrayList位置1,你可以保持这样的检查试图在那个现在的位置,这将确保您的应用程序不会崩溃访问前值:

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

但它会使它崩溃。我们不能在以前检查尺寸吗?如果我检查这样的大小if(listEvent.size()> = 1 && requestCount <= listEvent.get(1).getTotal()它会让我在我的回收视图中加载双重数据 –

+0

我想要的实际页面限制json。这是getTotal中的页面限制,所以每个项目都有页面限制,但我只想使用1项 –

+0

请检查我的更新,并让我知道它是否需要 –

0

它清楚地说:您尝试访问列表中不存在元素的第2个元素。 您应该在访问列表之前检查列表的大小。 可以如下检查:

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

PS:

我认为通过使用 获得(1)你打算访问的第二个元素。 如果你想访问第一个元素,你应该使用** .get(0)**来代替。