使用扫描仪从CSV文件填充微调器

时间:2012-07-06 18:32:44

标签: android android-spinner

使用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");
            }
        });
    }
}  

1 个答案:

答案 0 :(得分: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,并覆盖您创建的上一个适配器。

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

添加评论

长度= 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);