1

I'm trying to pass data from one screen to another screen. The first screen reads data from a CSV and puts data into a database table. Any data that is invalid, such as string in year (integer), is caught and stored in an ArrayList of errorItem which contains the Book title, author, date, isbn, copies, and tags. My program has successfully identified invalid csv entries, but when I pass the error data to be displayed, the listview only shows the last entry passed and repeats it.

What might be the problem here?

Repeating Entry

Main Code

ArrayList<itemLink> errorList = new ArrayList<itemLink>();
                        int successCounter = 0;
                          int errorCounter = 0;
                          String[][] errors = new String[1][6];
                          String[] line = new String[6];
                          try {
                              int titleCol = -1, authorCol = -1, dateCol = -1, isbnCol = -1, quantityCol = -1, tagCol = -1;
                              CSVReader reader = new CSVReader(new FileReader(new File(Environment.getExternalStorageDirectory().getPath()+location)));
                              String [] nextLine;
                                nextLine = reader.readNext();
                                int index = 0;
                                int lineLength = nextLine.length;
                                while(titleCol < 0 && index < lineLength)
                                {
                                    if(nextLine[index].contains("TITLE"))
                                        titleCol = index;
                                    index++;
                                }
                                index = 0;
                                while(authorCol < 0 && index < lineLength)
                                {
                                    if(nextLine[index].contains("AUTHOR"))
                                        authorCol = index;
                                    index++;
                                }
                                index = 0;
                                while(dateCol < 0 && index < lineLength)
                                {
                                    if(nextLine[index].contains("DATE"))
                                        dateCol = index;
                                    index++;
                                }
                                index = 0;
                                while(isbnCol < 0 && index < lineLength)
                                {
                                    if(nextLine[index].contains("ISBN"))
                                        isbnCol = index;
                                    index++;
                                }
                                index = 0;
                                while(quantityCol < 0 && index < lineLength)
                                {
                                    if(nextLine[index].contains("COPIES"))
                                        quantityCol = index;
                                    index++;
                                }
                                index = 0;
                                while(tagCol < 0 && index < lineLength)
                                {
                                    if(nextLine[index].contains("TAGS"))
                                        tagCol = index;
                                    index++;
                                }
                                System.out.println(nextLine[titleCol]);
                                System.out.println(nextLine[authorCol]);
                                System.out.println(nextLine[dateCol]);
                                System.out.println(nextLine[isbnCol]);
                                System.out.println(nextLine[quantityCol]);
                                System.out.println(nextLine[tagCol]);
                                int counter = 0;
                                while ((nextLine = reader.readNext()) != null) {
                                    // nextLine[] is an array of values from the line
                                    /*
                                     * nextLine[titleCol] = TITLE
                                     * nextLine[authorCol] = AUTHOR
                                     * nextLine[dateCol] = DATE
                                     * nextLine[isbnCol] = ISBN
                                     * nextLine[quantityCol] = QUANTITY
                                     * nextLine[tagCol] = TAGS
                                     */
                                    lineLength = nextLine.length;
                                    if(nextLine[isbnCol].contains("0") || nextLine[isbnCol].contains("1") 
                                            || nextLine[isbnCol].contains("2") || nextLine[isbnCol].contains("3")
                                            || nextLine[isbnCol].contains("4") || nextLine[isbnCol].contains("5")
                                            || nextLine[isbnCol].contains("6") || nextLine[isbnCol].contains("7")
                                            || nextLine[isbnCol].contains("8") || nextLine[isbnCol].contains("9"))
                                    {

                                        if(InventoryAdapter.isbnFoundInInventory(nextLine[isbnCol]) == false)
                                        {

                                            if(nextLine[dateCol].contains("0") || nextLine[dateCol].contains("1") 
                                                    || nextLine[dateCol].contains("2") || nextLine[dateCol].contains("3")
                                                    || nextLine[dateCol].contains("4") || nextLine[dateCol].contains("5")
                                                    || nextLine[dateCol].contains("6") || nextLine[dateCol].contains("7")
                                                    || nextLine[dateCol].contains("8") || nextLine[dateCol].contains("9"))
                                                line[2] = nextLine[dateCol];
                                            else
                                                line[2]="-9999";
                                            if(nextLine[quantityCol].contains("0") || nextLine[quantityCol].contains("1") 
                                                    || nextLine[quantityCol].contains("2") || nextLine[quantityCol].contains("3")
                                                    || nextLine[quantityCol].contains("4") || nextLine[quantityCol].contains("5")
                                                    || nextLine[quantityCol].contains("6") || nextLine[quantityCol].contains("7")
                                                    || nextLine[quantityCol].contains("8") || nextLine[quantityCol].contains("9"))
                                                line[4] = nextLine[quantityCol];
                                            else
                                                line[4]="-9999";
                                            if(tagCol < lineLength && nextLine[tagCol].length() > 0)
                                                line[5] = nextLine[tagCol];
                                            else
                                                line[5] = "*ERROR*";
                                            if(titleCol < lineLength && nextLine[titleCol].length() > 0)
                                                line[0] = nextLine[titleCol];
                                            else
                                                line[0] = "*ERROR*";
                                            if(authorCol < lineLength && nextLine[authorCol].length() > 0)
                                                line[1] = nextLine[authorCol];
                                            else
                                                line[1] = "*ERROR*";
                                            if(isbnCol < lineLength && nextLine[isbnCol].length() > 0)
                                                line[3] = nextLine[isbnCol];
                                            else
                                                line[3] = "*ERROR*";

                                            if(line[0].equals("*ERROR*") || line[1].equals("*ERROR*")
                                                    || line[3].equals("*ERROR*")|| line[5].equals("*ERROR*")
                                                    || line[2].equals("-9999")|| line[4].equals("-9999"))
                                            {
                                                System.out.println(counter+". ERROR FOUND: "+line[0]);
                                                errorList.add(new itemLink(line[0], line[1], Integer.parseInt(line[2]), 
                                                        line[3], Integer.parseInt(line[4]), line[5]));
                                                errorCounter++;
                                            }
                                            else
                                            {
                                                System.out.println(counter+". SUCCESSFULLY ADDED: "+line[0]);
                                                InventoryAdapter.insertEntry(line[0], line[1], line[3], Integer.parseInt(line[2]),
                                                        line[5], Integer.parseInt(line[4]), 14);
                                                successCounter++;
                                            }
                                        }
                                    }
                                    counter++;

                               }
                          } catch (FileNotFoundException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                          progressDialog.dismiss();

                          Intent i=new Intent(InventorySyncScreen.this,SyncSuccessScreen.class);
                            i.putExtra("username",userName);
                            i.putExtra("numSuccess",successCounter);
                            i.putExtra("numError", errorCounter);
                            i.putExtra("errorList", errorList);
                            startActivity(i);

SyncSuccessScreen

Intent intent = getIntent();
          final String userName = intent.getExtras().getString("username");
          int numSuccess= intent.getExtras().getInt("numSuccess");
          int numError= intent.getExtras().getInt("numError");
          @SuppressWarnings("unchecked")
          ArrayList<itemLink> errorList = (ArrayList<itemLink>) getIntent().getSerializableExtra("errorList");
          textNumSuccess.setText("Items Successfully Synced: "+numSuccess);
          textNumError.setText("Data Errors Found: "+numError);
// Set up array
            String[] errors = new String[6];
            for(int i = 0; i < errorList.size(); i++)
            {
                System.out.println("errors[0] = "+errors[0]);
                errors[0] = errorList.get(i).title;
                errors[1] = errorList.get(i).author;
                errors[2] = ((Integer)errorList.get(i).date).toString();
                errors[3] = errorList.get(i).isbn;
                errors[4] = ((Integer)errorList.get(i).quantity).toString();
                errors[5] = errorList.get(i).tags;
                    reportArray.add(new ErrorItem(i, errors));
            }

            // add data in custom adapter
            errorAdapter = new CustomErrorAdapter(this, R.layout.errorlist_row, reportArray);
            ListView dataList = (ListView) findViewById(R.id.errorlist_row);
            dataList.setAdapter(errorAdapter);

CustomErrorAdapter

public class CustomErrorAdapter extends ArrayAdapter<ErrorItem> {
Context context;
int layoutResourceId;
LinearLayout linearMain;
ArrayList<ErrorItem> data = new ArrayList<ErrorItem>();

public CustomErrorAdapter(Context context, int layoutResourceId,
              ArrayList<ErrorItem> data) {
       super(context, layoutResourceId, data);
       this.layoutResourceId = layoutResourceId;
       this.context = context;
       this.data = data;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = null;

   if (convertView == null) {
          LayoutInflater inflater = ((Activity) context).getLayoutInflater();
          row = inflater.inflate(layoutResourceId, parent, false);
          //Make sure the textview exists in this xml
   } else {
          row = convertView;
   }

   ErrorItem myItem = data.get(position);
   TextView titleLabel = (TextView) row.findViewById(R.id.titleText);
   titleLabel.setText(myItem.details[0]);
   TextView authorLabel = (TextView) row.findViewById(R.id.authorText);
   authorLabel.setText(myItem.details[1]);
   TextView dateLabel = (TextView) row.findViewById(R.id.dateText);
   dateLabel.setText(myItem.details[2]);
   TextView isbnLabel = (TextView) row.findViewById(R.id.isbnText);
   isbnLabel.setText(myItem.details[3]);
   TextView copiesLabel = (TextView) row.findViewById(R.id.copiesText);
   copiesLabel.setText(myItem.details[4]);
   TextView tagLabel = (TextView) row.findViewById(R.id.tagText);
   tagLabel.setText(myItem.details[5]);

   if(myItem.details[5].equals("*ERROR*"))
       tagLabel.setTextColor(Color.parseColor("#ff2626"));
   if(myItem.details[2].equals("-9999"))
       dateLabel.setTextColor(Color.parseColor("#ff2626"));
   if(myItem.details[4].equals("-9999"))
       copiesLabel.setTextColor(Color.parseColor("#ff2626"));
   if(myItem.details[0].equals("*ERROR*"))
       titleLabel.setTextColor(Color.parseColor("#ff2626"));
   if(myItem.details[1].equals("*ERROR*"))
       authorLabel.setTextColor(Color.parseColor("#ff2626"));
   if(myItem.details[3].equals("*ERROR*"))
       isbnLabel.setTextColor(Color.parseColor("#ff2626"));

   return row;
}
}

Error Item

public class ErrorItem {

   public int num;
   public String[] details;

   public ErrorItem(int num, String[] details) {
          super();

          this.details = details;
   }
   public int getNum() {
       return num;
   }
   public void setNum(int num) {
       this.num = num;
   }
   public String[] getDetails() {
          return details;
   }
   public void setDetails(String[] details) {
          this.details = details;
   }

}

Logs Show Logs reveal that ArrayList is being passed through correctly into SyncSuccessScreen.

01-22 01:42:51.327: I/System.out(8717): errors[0] = *ERROR*
01-22 01:42:51.327: I/System.out(8717): errors[0] = The big beautiful
01-22 01:42:51.327: I/System.out(8717): errors[0] = Pieces of my sister's life
erad
  • 1,766
  • 2
  • 17
  • 26

4 Answers4

3

you have to implement serialisable on class Itemlink and have to get value from activity as getintent().getserialisableExtra()

eg:

public class Itemlink implements Serializable{

} pass value as

intent.putExtra("key",value);
getvalue as `getintent().getSerilaziable.Extra("key")`
Jayaraj
  • 197
  • 1
  • 13
1

When you need to communicate the your custom objects like ErrorItem , then the custom object must implement Parcelable or Serializable

class ErrorItem implements Parcelable{

Check this

Check Parcelable is faster than Serializable

Community
  • 1
  • 1
Jagadesh Seeram
  • 2,630
  • 1
  • 16
  • 29
1

The error is in the SyncSuccessScreen

errors[0] = errorList.get(i).title;
            errors[1] = errorList.get(i).author;
            errors[2] = ((Integer)errorList.get(i).date).toString();
            errors[3] = errorList.get(i).isbn;
            errors[4] = ((Integer)errorList.get(i).quantity).toString();
            errors[5] = errorList.get(i).tags;
                reportArray.add(new ErrorItem(i, errors));

Should declare new instance of String[] errors otherwise each ErrorItem references the same String[] errors and changing one of them affects every ErrorItem.

Correct:

String[] errors = new String[6];
        for(int i = 0; i < errorList.size(); i++)
        {
            errors = new String[6]; //add this
            errors[0] = errorList.get(i).getTitle();
            errors[1] = errorList.get(i).getAuthor();
            errors[2] = ((Integer)errorList.get(i).getDate()).toString();
            errors[3] = errorList.get(i).getISBN();
            errors[4] = ((Integer)errorList.get(i).getQuantity()).toString();
            errors[5] = errorList.get(i).getTags();
            reportArray.add(i, new ErrorItem(i, errors));
        }
erad
  • 1,766
  • 2
  • 17
  • 26
0

have your ErrorItem implements Serializable

public class ErrorItem implements Serializable{

and in your intent change this line: i.putExtra("errorList", errorList); to i.putSerializableExtra("errorList",errorList);

and then get it with :

ArrayList errorList = (ArrayList) getIntent().getSerializableExtra("errorList");

Lena Bru
  • 13,521
  • 11
  • 61
  • 126