2
votes
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++;
}

Using this stackoverflow answer, I iterate through my arraylist of CustomObject. Custom object is just a POJO class with setters and getters. The setters and getters have different data types, such as int, String, double etc.

mAdapter.getItemsData returns the araylist from the adapter class.

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

    notifyItemRemoved(position);
}

Here is the exception

java.lang.IndexOutOfBoundsException: Invalid index 18, size is 18 at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) at java.util.ArrayList.get(ArrayList.java:308) at com.test.TestActivity$5.onClick(TestActivity.java:280) at android.view.View.performClick(View.java:4780) at android.view.View$PerformClick.run(View.java:19866) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

CustomObject class

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

}

How data is added

In onCreate of activity, I instantiate Recyclerview. RecyclerView takes an arraylist, so I pass an empty one.

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

Later on in an AsyncTask, I add the items to the Adapter.

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

Here is the addItem class

Declared at top of adapter class private final List<FoursquareVenue> itemsData;

public void addItem(FoursquareVenue data) {
        itemsData.add(data);
        notifyItemInserted(itemsData.size() - 1);
    }
1
First line of the exception clearly says whats wrong. Index starts from 0 to size - 1Ankur Shanbhag

1 Answers

1
votes

Edit

Since you our chat and your edits:

You need to add and remove the items to your ArrayList and them notify adapter of change.

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

Then loop through your ArrayList to remove items.


You've just muddled yourself up a bit in how you are trying to access your data.

There is a problem that you are creating an iterator of CustomObjects, and parsing it to the data type of mAdapter.getItemsData().

Removing the element from the iterator should remove it from the list.

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

Let me know if this helps.