0

ここでは、Excel のデータに基づいて動的に ArrayList に行 (カスタム レイアウト) を追加します。読み込まれた ArrayAdapter の最後の値のみを取得することを除いて、すべて正常に機能しています。

まず、インスタンス変数の宣言は次のとおりです。

List<Record> model = new ArrayList<Record>();
RecordAdapter adapter = null;

これは、問題のある領域であると思われるコードの一部です。

class RecordAdapter extends ArrayAdapter<Record> {
    RecordAdapter() {
        super(Census.this, R.layout.row, model);
    }

    public View getView(int position, View convertView,
                        ViewGroup parent) {
        View row = convertView;
        RecordHolder holder = null;
        if (row == null) {
            LayoutInflater inflater = getLayoutInflater();
            row = inflater.inflate(R.layout.row, parent, false);
            holder = new RecordHolder(row);
            row.setTag(holder);
        } else {
            holder = (RecordHolder) row.getTag();
        }
        holder.populateFrom(model.get(position));
        return (row);
    }
}

これは RecordHolder クラスです。

static class RecordHolder {
    TextView tvEntryNo = null;
    TextView tvPNO = null;
    TextView tvDefoliator = null;
    TextView tvLpF = null;
    CheckBox cbOryctes = null;
    CheckBox cbTermite = null;
    CheckBox cbRat = null;
    private ImageView icon = null;

    RecordHolder(View row) {
        tvEntryNo = (TextView) row.findViewById(R.id.tvEntry);
        tvPNO = (TextView) row.findViewById(R.id.tvPNO);
        tvDefoliator = (TextView) row.findViewById(R.id.tvDefoliator);
        tvLpF = (TextView) row.findViewById(R.id.tvLpF);
        cbOryctes = (CheckBox) row.findViewById(R.id.cbOryctes);
        cbTermite = (CheckBox) row.findViewById(R.id.cbTermite);
        cbRat = (CheckBox) row.findViewById(R.id.cbRat);
        icon = (ImageView) row.findViewById(R.id.icon);
    }

    void populateFrom(Record r) {
        tvEntryNo.setText("Pokok ke: " + r.getEntryNo());
        tvPNO.setText("PNO: " + r.getPNO());
        tvDefoliator.setText("Species: " + r.getDefSpec());
        tvLpF.setText("Larva: " + r.getLpF());
        int temp = 0;

        int counter = 0;

        if (r.isOrycDmg()) {
            cbOryctes.setChecked(true);
        } else {
            cbOryctes.setChecked(false);
        }

        if (r.isTermiteDmg()) {
            cbTermite.setChecked(true);
        } else {
            cbTermite.setChecked(false);
        }

        if (r.isRatDmg()) {
            cbRat.setChecked(true);
        } else {
            cbRat.setChecked(false);
        }

        if ((r.getDefSpec() == "Setora Nitens" || r.getDefSpec() == "Setothosea Asigna" ||
                r.getDefSpec() == "Mahasena Corbetti") && Integer.parseInt(r.getLpF().toString()) > 5) {
            counter++;
        }

        if (!r.getLpF().trim().equals("")) {
            temp = Integer.parseInt(r.getLpF());
        }
        if (temp > 10) {
            counter++;
        }
        if (r.isOrycDmg()) {
            counter++;
        }
        if (r.isTermiteDmg()) {
            counter++;
        }
        if (r.isRatDmg()) {
            counter++;
        }

        if (r.getPnD_Time().trim().equals("")) {
            //New Data
            icon.setImageResource(R.drawable.add);
        } else if (counter == 0) {
            //Negligible problem
            icon.setImageResource(R.drawable.green_alert);
        } else if (counter == 1) {
            //need attention, minor problem
            icon.setImageResource(R.drawable.yellow_alert);
        } else {
            //serious problem
            icon.setImageResource(R.drawable.red_alert);
        }
    }
}

これは、Excel ファイルからデータをロードするために使用する loadData() メソッドです。

public void loadData() {
    //Instantiate holder
    Record r = new Record();
    try {
        //get the excel file
        workbook = new HSSFWorkbook(file);
        sheet = workbook.getSheetAt(0);

        //parse data from excel to holder
        for (int i = FIRST_ROW_TO_GET; i <= (sheet.getLastRowNum() + 1); i++) {
            Row row = sheet.getRow(i);
            //New Data
            if (row == null) {
                r.setFormNo(filename(fileName));
                r.setEntryNo(String.valueOf(i));
                r.setPNO("Data Baru");
                r.setDefSpec("Tidak Ada");
                r.setLpF("");
                r.setOrycDmg(false);
                r.setTermiteDmg(false);
                r.setRatDmg(false);
                r.setSampler("");
                r.setPnD_Date("");
                r.setPnD_Time("");

            } else {
                //Existing Data
                for (int cn = row.getFirstCellNum(); cn <= row.getLastCellNum(); cn++) {
                    Cell c = row.getCell(cn, Row.RETURN_BLANK_AS_NULL);
                    //Blank cells handler
                    if (c == null) {
                        switch (cn) {
                            case 0:
                                r.setFormNo(filename(fileName));
                                break;
                            case 1:
                                r.setEntryNo(String.valueOf(i));
                                break;
                            case 2:
                                r.setPNO("Data Baru");
                                break;
                            case 3:
                                r.setDefSpec("Tidak Ada");
                                break;
                            case 4:
                                r.setLpF("");
                                break;
                            case 5:
                                r.setOrycDmg(false);
                                break;
                            case 6:
                                r.setTermiteDmg(false);
                                break;
                            case 7:
                                r.setRatDmg(false);
                                break;
                            case 8:
                                r.setSampler("");
                                break;
                            case 9:
                                r.setPnD_Date("");
                                break;
                            case 10:
                                r.setPnD_Time("");
                                break;
                        }

                    } else {
                        //non empty cells handler
                        switch (cn) {
                            case 0:
                                r.setFormNo(c.getStringCellValue());
                                break;
                            case 1:
                                r.setEntryNo(c.getStringCellValue());
                                break;
                            case 2:
                                r.setPNO(c.getStringCellValue());
                                break;
                            case 3:
                                r.setDefSpec(c.getStringCellValue());
                                break;
                            case 4:
                                r.setLpF(c.getStringCellValue());
                                break;
                            case 5:
                                if (Integer.parseInt(c.getStringCellValue()) == 1)
                                    r.setOrycDmg(true);
                                else
                                    r.setOrycDmg(false);
                                break;
                            case 6:
                                if (Integer.parseInt(c.getStringCellValue()) == 1)
                                    r.setTermiteDmg(true);
                                else
                                    r.setTermiteDmg(false);
                                break;
                            case 7:
                                if (Integer.parseInt(c.getStringCellValue()) == 1)
                                    r.setRatDmg(true);
                                else
                                    r.setRatDmg(false);
                                break;
                            case 8:
                                r.setSampler(c.getStringCellValue());
                                break;
                            case 9:
                                r.setPnD_Date(c.getStringCellValue());
                                break;
                            case 10:
                                r.setPnD_Time(c.getStringCellValue());
                                break;
                        }

                    }
                }
            }
            adapter.add(r);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Record.java には、変数の宣言のみが含まれます。アプリは問題なくコンパイルされましたが、ListView に LoadData() ループの最後の値しか入力されないという問題が発生しました。問題が私の getView() メソッドにあるのではないかと疑っています。誰かが私が間違いを犯しているかもしれない場所を指摘するのを助けることができますか?

必要な追加のコードを提供させていただきます。前もって感謝します。:)

4

1 に答える 1

1

Recordループ内で新しいオブジェクトを初期化する必要があります。そうしないと、同じオブジェクトが更新され、各行に同じデータが表示されます。

public void loadData() {
    try {
        //get the excel file
        workbook = new HSSFWorkbook(file);
        sheet = workbook.getSheetAt(0);

        //parse data from excel to holder
        for (int i = FIRST_ROW_TO_GET; i <= (sheet.getLastRowNum() + 1); i++) {
            Record r = new Record(); // move this HERE
            Row row = sheet.getRow(i);

            ...
            ...
于 2013-11-08T05:01:30.497 に答える