Android 通过 Intent 传递 ArrayList

标签 android listview csv android-intent android-listview

我正在尝试将数据从一个屏幕传递到另一个屏幕。第一个屏幕从 CSV 中读取数据并将数据放入数据库表中。任何无效的数据,例如年份字符串(整数),都会被捕获并存储在 errorItem 的 ArrayList 中,其中包含书名、作者、日期、isbn、副本和标签。我的程序已成功识别无效的 csv 条目,但是当我传递要显示的错误数据时, ListView 仅显示最后传递的条目并重复它。

这可能是什么问题?

Repeating Entry

主要代码

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

同步成功屏幕

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

自定义错误适配器

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

错误项目

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

}

日志显示 日志显示 ArrayList 已正确传递到 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

最佳答案

您必须在类 Itemlink 上实现可序列化,并且必须从 getintent().getserialisableExtra()

Activity 中获取值

例如:

public class Itemlink implements Serializable{

} 传递值作为

intent.putExtra("key",value);
getvalue as `getintent().getSerilaziable.Extra("key")`

关于Android 通过 Intent 传递 ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21275558/

相关文章:

Android(API 7)-动画 : onAnimationRepeat

java - 在 log.d 中获取 json 响应,但不在应用程序内获取(包含代码)

java - 使用 CSV 文件更新 mongoDB 集合

android - 无法在 Android Studio 2 中清理或重建项目

android - 如何从 Maven JCenter 中删除我的库?

wpf - 在 ListView 中选择mvvm ComboBox

shell - 在 .csv 文件中使用 shell 脚本在逗号上拆分字符串但忽略双引号内的逗号?

ruby-on-rails - Ruby on Rails - 从 CSV 文件导入数据

java - Android ListView Adapter 错误调用notifyDataSetChanged,Android bug?

java - 如何在 Android 中从 Fragment 调用 ArrayAdapter 构造函数