2015-08-08 2 views
2
int i = 0; //used for getting item position 
for (Iterator<CustomObject> iterator = mAdapter.getItemsData().iterator(); iterator.hasNext();) { 

    if (mAdapter.getItemsData().get(i).getPriceTier() != 1) { //if statement throws error 
     // Remove the current element from the iterator and the list. 
     iterator.remove(); 
     mAdapter.removeFromItemsData(i); 
    } 
    i++; 
} 

Использование this StackOverflow ответ, я перебирать мой ArrayList из CustomObject. Пользовательский объект - это просто класс POJO с сеттерами и геттерами. У сеттеров и геттеров есть разные типы данных, такие как int, String, double и т. Д.java.lang.IndexOutOfBoundsException: Invalid индекс 18, размер 18

mAdapter.getItemsData возвращает арайлиста из класса адаптера.

//method just notifies the RecyclerView that an item was removed. 
public void removeFromItemsData(int position){ 

    notifyItemRemoved(position); 
} 

Вот исключение

java.lang.IndexOutOfBoundsException: недействительный индекс 18, размер 18 в java.util.ArrayList.throwIndexOutOfBoundsException (ArrayList.java:255) на Java. util.ArrayList.get (ArrayList.java:308) на com.test.TestActivity $ 5.onClick (TestActivity.java:280) на android.view.View.performClick (View.java:4780) на android.view .View $ PerformClick.run (View.java:19866) в android.os.Handler.handleCallback (Han dler.java:739) на android.os.Handler.dispatchMessage (Handler.java:95) на android.os.Looper.loop (Looper.java:135) на android.app.ActivityThread.main (ActivityThread. java: 5254) на java.lang.reflect.Method.invoke (собственный метод) на java.lang.reflect.Method.invoke (Method.java:372) на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller .run (ZygoteInit.java:903) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:698)

CustomObject класс

public class CustomObject{ 
    private String name; 
    private int distance; 
    private String category; 
    private String id; 
    private double rating; 
    private String ratingColor; 
    private String prefix; 
    private String suffix; 
    private int priceTier; 
    private String currency; 
    private String phone; 
    private String twitter; 
    private String url; 
    private String menu; 
    String address; 
    String city; 
    String state; 
    String postalCode; 
    double lat; 
    double lng; 
    String review; 
    int reviewCount; 
    String firstName; 
    String lastName; 
    String userIconPrefix; 
    String userIconSuffix; 
    String secondsReview; 

    public CustomObject() { 
     this.name = ""; 
     this.distance = 0; 
     this.setCategory(""); 
     this.id = ""; 
     this.rating = 0; 
     this.ratingColor = ""; 
     this.prefix = ""; 
     this.suffix = ""; 
     this.priceTier = 0; 
     this.currency = ""; 
     this.phone = ""; 
     this.twitter = ""; 
     this.url = ""; 
     this.menu = ""; 
     this.address = ""; 
     this.city = ""; 
     this.state = ""; 
     this.postalCode = ""; 
     this.lat = 0; 
     this.lng = 0; 
     this.review = ""; 
     this.reviewCount = 0; 
     this.firstName = ""; 
     this.lastName = ""; 
     this.userIconPrefix = ""; 
     this.userIconSuffix = ""; 
     this.secondsReview = ""; 
    } 

    public void setSecondsReview(String secondsReview){ 
     this.secondsReview = secondsReview; 
    } 

    public String getSecondsReview(){ 
     return secondsReview; 
    } 

    public void setUserIconSuffix(String userIconSuffix){ 
     this.userIconSuffix = userIconSuffix; 
    } 

    public String getUserIconSuffix(){ 
     return userIconSuffix; 
    } 

    public void setUserIconPrefix(String userIconPrefix){ 
     this.userIconPrefix = userIconPrefix; 
    } 

    public String getUserIconPrefix(){ 
     return userIconPrefix; 
    } 

    public void setFirstName(String firstName){ 
     this.firstName = firstName; 
    } 

    public String getFirstName(){ 
     return firstName; 
     //todo if String firstNAme == null, then return "a foursquare user" 
    } 

    public void setLastName(String lastName){ 
     this.lastName = lastName; 
    } 

    public String getLastName(){ 
     return lastName; 
    } 

    public void setReviewCount(int reviewCount){ 
     this.reviewCount = reviewCount; 
    } 

    public int getReviewCount(){ 
     return reviewCount; 
    } 

    public void setReview(String review){ 
     this.review = review; 
    } 

    public String getReview(){ 
     return review; 
    } 

    public void setLng(double lng){ 
     this.lng = lng; 
    } 

    public double getLng(){ 
     return lng; 
    } 

    public void setLat(double lat){ 
     this.lat = lat; 
    } 

    public double getLat(){ 
     return lat; 
    } 

    public void setPostalCode(String postalCode){ 
     this.postalCode = postalCode; 
    } 

    public String getPostalCode(){ 
     return postalCode; 
    } 

    public void setState(String state){ 
     this.state = state; 
    } 

    public String getState(){ 
     return state; 
    } 

    public void setCity(String city){ 
     this.city = city; 
    } 

    public String getCity(){ 
     return city; 
    } 

    public void setAddress(String address){ 
     this.address = address; 
    } 

    public String getAddress(){ 
     return address; 
    } 

    public void setMenuUrl(String menu){ 
     this.menu = menu; 
    } 

    public String getMenuUrl(){ 
     return menu; 
    } 

    public void setUrl(String url){ 
     this.url = url; 
    } 

    public String getUrl(){ 
     return url; 
    } 

    public void setTwitter(String twitter){ 
     this.twitter = twitter; 
    } 

    public String getTwitter(){ 
     return twitter; 
    } 

    public void setPhone(String phone){ 
     this.phone = phone; 
    } 

    public String getPhone(){ 
     return phone; 
    } 

    public String getCurrency(){ 
     return currency; 
    } 

    public void setCurrency(String currency){ 
     this.currency = currency; 
    } 

    public int getPriceTier(){ 
     return priceTier; 
    } 

    public void setPriceTier(int priceTier){ 
     this.priceTier = priceTier; 
    } 

    public String getSuffix(){ 
     return suffix; 
    } 

    public void setSuffix(String suffix){ 
     this.suffix = suffix; 
    } 

    public String getPrefix(){ 
     return prefix; 
    } 

    public void setPrefix(String prefix){ 
     this.prefix = prefix; 
    } 

    public double getRating(){ 
     if(rating > 0){ 
      return rating; 
     } 
     return 0; //TODO display symbol if rating not found 
    } 

    public void setRating(double rating){ 
     this.rating = rating; 
    } 

    public Integer getDistance() { 
     if (distance >= 0) { 
      return distance; 
     } 
     return 0; //TODO display symbol if distance not found, like N/A 
    } 

    public void setDistance(int distance) { 
      this.distance = distance; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getCategory() { 
     return category; 
    } 

    public void setCategory(String category) { 
     this.category = category; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getId() { 
     return id; 
    } 

} 

Как данные добавляются

В onCreate of activity, я создаю Recyclerview. RecyclerView принимает arraylist, поэтому я передаю пустой.

List listTitle = new ArrayList(); //empty arraylist 
mAdapter = new Fragment1Adapter(listTitle); 

RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView); 
mRecyclerView.setHasFixedSize(true); 
mRecyclerView.setItemAnimator(new DefaultItemAnimator()); 
mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 
mRecyclerView.setAdapter(mAdapter); 

Позже в AsyncTask я добавляю элементы в адаптер.

for (int i = 0; i < jsonArray.length(); i++) { 
    CustomObject poi = new CustomObject(); 

    if (jsonArray.getJSONObject(i).has("venue")) { 
     poi.setName(jsonArray.getJSONObject(i).getJSONObject("venue").getString("name")); 
     poi.setId(jsonArray.getJSONObject(i).getJSONObject("venue").getString("id")); 
    } 
    mAdapter.addItem(poi); 
} 

Вот класс AddItem

Заявленный в верхней части класса адаптера private final List<FoursquareVenue> itemsData;

public void addItem(FoursquareVenue data) { 
     itemsData.add(data); 
     notifyItemInserted(itemsData.size() - 1); 
    } 
+2

В первой строке исключения четко говорится, что не так. Индекс начинается с 0 до размера - 1 –

+0

Мы знаем, что это индекс исключения исключений, но почему он его бросает. –

+0

Спасибо за это @HaloMediaz, можете ли вы теперь показать мне, как вы добавляете эту информацию в свой список и адаптер? Как вы добавляете детали customObject. Кроме того, вы можете увидеть дискуссию, которую я начал, вы получаете от этого сигналы? Не уверен в правилах rep в чатах –

ответ

1

Edit

Поскольку вы наш чат и ваши изменения:

Вы необходимость для добавления и удаления элементов в ArrayList, и они уведомляют адаптер об изменении.

CustomObject poi = new CustomObject(); 
if (jsonArray.getJSONObject(i).has("venue")) { 
    poi.setName(jsonArray.getJSONObject(i).getJSONObject("venue").getString("name")); 
    poi.setId(jsonArray.getJSONObject(i).getJSONObject("venue").getString("id")); 
} 
listTitle.addItem(poi);// Add to ListArray 

Затем проведите через свой ArrayList, чтобы удалить элементы.


Вы только немного запутались в том, как вы пытаетесь получить доступ к своим данным.

Существует проблема, что вы создаете итератор CustomObjects и разбираете его с типом данных mAdapter.getItemsData().

Извлечение элемента из итератора должно удалить его из списка.

for (Iterator<CustomObject> iterator = mAdapter.iterator(); iterator.hasNext();) { 
    CustomObject itemsData = iterator.next(); 
    if (itemsData.getItemsData().get(i).getPriceTier() != 1) { //if statement throws error 
      // Remove the current element from the iterator and the list. 

      iterator.remove(); 
     } 
     i++; 
     } 
    CustomObject itemsData = iterator.next(); 

Дайте мне знать, если это поможет.

+1

Я просто добавлю, я не уверен, что вы пытаетесь пропустить какой-то список в каждом объекте. –

+0

С 'CustomObject itemsData = iterator.next();' Я могу получить доступ только к сеттерам и геттерам. Мне нужно получить доступ к arraylist, который находится внутри моего класса адаптера. Спасибо, что попробовали ti help :) – HaloMediaz

+1

@HaloMediaz вы можете просто дать мне дополнительную информацию? Было бы полезно, если бы я мог видеть ваш класс и именно то, к чему вы пытаетесь получить доступ. –

Смежные вопросы