0

使用 Android (Eclipse) 我正在尝试读取 .csv 文件并使用 Scanner 动态填充 Spinner。尝试了许多方法,结果相同。模拟器显示 Spinner,但仅填充最后一个逗号和价格。还需要将所有三个变量存储在数组中,并在选择 Spinner 时检索它们以填充 EditText 字段。任何帮助将不胜感激...

数据文件记录:

4,铝罐,.55 5,带猫转换器的车辆,9.00 18,黄铜(讽刺红/黄),.20 1001, 客户#查找,-2.00

爪哇:

public class BRprogramActivity extends Activity {
    private static final String TAG = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //
        Button addButton;
        Button editButton;
        Button sendButton;
        //  
        Spinner array_spinner;
        //
        //      activate soft Keyboard
        this.getWindow().setSoftInputMode
        (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); 
        //
        //      .csv comma separated values file
        //        
        try {
            Scanner scanner = new Scanner(getResources().openRawResource(R.raw.brdata));  
            //         
            while (scanner.hasNext()) {
                String data = (scanner.next());
                String [] values = data.split(",");
                item = values[0];              
                description = values[1];
                price = values[2];    
                //  
                array_spinner = (Spinner)findViewById(R.id.spinner1);         
                ArrayAdapter<String> adapter = new ArrayAdapter<String>
                (this,android.R.layout.simple_spinner_item,values);
                array_spinner.setAdapter(adapter); 
            }       
            scanner.close();

        }   catch (Exception e) {
            Log.e(TAG, "Exception: "+Log.getStackTraceString(e));
        }
        //
        addButton = (Button) findViewById(R.id.addbutton);

        addButton.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                Log.v("test", "ADD button clicked");
            }
        });
        //
        editButton = (Button) findViewById(R.id.editbutton);

        editButton.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                Log.v("test", "EDIT button clicked");
            }
        });    
        //
        sendButton = (Button) findViewById(R.id.sendbutton);

        sendButton.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                Log.v("test", "SEND button clicked");
            }
        });
    }
}  
4

1 回答 1

0

如果您想在微调器的一行中显示 CSV 的每一行,请尝试以下操作:

List<String> list = new ArrayList<String>();
while (scanner.hasNext()) {
    list.add(scanner.next());
}

array_spinner = (Spinner)findViewById(R.id.spinner1);         
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
array_spinner.setAdapter(adapter); 

虽然对于普通用户来说可读性很差,但也许您只想显示描述和价格:

List<String> list = new ArrayList<String>();
while (scanner.hasNext()) {
    String data = scanner.next();
    String [] values = data.split(",");
    list.add(values[1] + "  $" + values[2]);
}       

您发布的方法仅显示了最后一个 CSV 行,因为您正在为 CSV 中的每一行创建一个新的 ArrayAdapter 并覆盖您之前创建的适配器。

通过将 Scanner 的结果存储在 List 中并将适配器的定义移出 Scanner 循环,您应该能够看到您希望的结果。

从评论添加

长度 = 2、索引 = 2 的 OutOfBounds 异常表明实际 CSV 中的至少一行只有两个值(一个逗号)。为了帮助您找到该行,请尝试以下操作:

if(values.length != 3)
    Log.v("Example", "Malformed row: " + data);
else
    list.add(values[1] + "  $" + values[2]);

另外,我没有提到您没有为 Spinner 设置下拉布局。这不会导致应用程序崩溃,但会创建标准用户界面:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
于 2012-07-06T18:44:34.217 回答