Java 将字符串ArrayList放入SQLite数据库

Java 将字符串ArrayList放入SQLite数据库,java,android,sqlite,arraylist,Java,Android,Sqlite,Arraylist,我无法将整个字符串正确地放入arraylist。我假设这个错误与我的自定义textwatcher有关,或者与我如何在数组列表中循环有关。这是我的密码: case R.id.action_add: Workout workout = new Workout("", "", "", ""); workoutList.add(workout); ListView exerciseList =

我无法将整个字符串正确地放入arraylist。我假设这个错误与我的自定义textwatcher有关,或者与我如何在数组列表中循环有关。这是我的密码:

      case R.id.action_add:
                Workout workout = new Workout("", "", "", "");
                workoutList.add(workout);

                ListView exerciseList = (ListView) findViewById(R.id.exerciseListView);
                CustomAdapter myAdapter = new CustomAdapter(this, R.layout.custom_list, workoutList);
                exerciseList.setAdapter(myAdapter);

                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    public class CustomAdapter extends ArrayAdapter<Workout> {

        private int layoutResource;

        public CustomAdapter(Context context, int layoutResource, List<Workout> workoutList) {
            super(context, layoutResource, workoutList);
            this.layoutResource = layoutResource;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            View view = convertView;

            if (view == null) {
                LayoutInflater layoutInflater = LayoutInflater.from(getContext());
                view = layoutInflater.inflate(layoutResource, null);

            }

            Workout workout = getItem(position);

            if (workout != null) {
                final EditText exercise = (EditText) view.findViewById(R.id.exercise);
                final EditText reps = (EditText) view.findViewById(R.id.reps);
                final EditText sets = (EditText) view.findViewById(R.id.sets);

                if (exercise != null){
                    exercise.addTextChangedListener(new CustomWatcher(exercise));
                }

                if (reps != null) {
                    reps.addTextChangedListener(new CustomWatcher(reps));
                }

                if (sets != null) {
                    sets.addTextChangedListener(new CustomWatcher(sets));
                }
            }

            return view;
        }
    }
    //Textwatcher class
    class CustomWatcher implements TextWatcher {

        private View view;
        public CustomWatcher(View view) {
            this.view = view;
        }

        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
        public void afterTextChanged(Editable editable) {
            String text = editable.toString();
            switch (view.getId()) {

                //exercises
                case R.id.exercise:
                   exercises.add(text);
                    break;
                //reps
                case R.id.reps:
                   reps.add(text);
                    break;
                //sets
                case R.id.sets:
                    sets.add(text);
                    break;
            }
        }
    }
}
案例R.id.action\u添加:
锻炼锻炼=新锻炼(“,”,“,”);
训练列表。添加(训练);
ListView exerciseList=(ListView)findViewById(R.id.exerciseListView);
CustomAdapter myAdapter=新的CustomAdapter(此,R.layout.custom_列表,workoutList);
exerciseList.setAdapter(myAdapter);
返回true;
违约:
返回super.onOptionsItemSelected(项目);
}
}
公共类CustomAdapter扩展了ArrayAdapter{
私人内部布局资源;
公共CustomAdapter(上下文上下文、内部布局资源、列表工作列表){
超级(上下文、布局资源、工作列表);
this.layoutResource=layoutResource;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=转换视图;
如果(视图==null){
LayoutInflater LayoutInflater=LayoutInflater.from(getContext());
视图=LayoutFlater.充气(layoutResource,null);
}
锻炼=获取项目(位置);
如果(训练!=null){
最终的EditText练习=(EditText)view.findViewById(R.id.exercise);
最终EditText reps=(EditText)view.findViewById(R.id.reps);
最终EditText集=(EditText)view.findViewById(R.id.sets);
如果(练习!=null){
addTextChangedListener(新CustomWatcher(练习));
}
如果(重复次数!=null){
代表addTextChangedListener(新的CustomWatcher(代表));
}
如果(设置!=null){
addTextChangedListener(新的CustomWatcher(sets));
}
}
返回视图;
}
}
//Textwatcher类
类CustomWatcher实现TextWatcher{
私人视野;
公共CustomWatcher(视图){
this.view=视图;
}
public void beforeTextChanged(CharSequence CharSequence,inti,inti1,inti2){
public void onTextChanged(CharSequence CharSequence,inti,inti1,inti2){
public void PostTextChanged(可编辑){
字符串文本=可编辑的.toString();
开关(view.getId()){
//练习
案例R.id.练习:
增加(文本);
打破
//代表
案例R.id.代表:
添加代表(文本);
打破
//设置
案例R.id.set:
添加(文本);
打破
}
}
}
}
这些箱子是纽扣。因此,当我单击add按钮时,我试图将自定义列表视图添加到包含三个文本视图的页面中。然后,当我单击“保存”时,我试图让它将每个编辑文本位置的数据保存到数组列表中,以存储到我的数据库中

 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection for menu
        switch (item.getItemId()) {
            case R.id.action_save:

                String title = MyWorkoutsActivity.workouts.get(workoutID);
                String ex;
                String rp;
                String st;
                SQLDatabase db = new SQLDatabase(this);
                for(int i = 0; i < workoutList.size(); i++){
                   //exercises, reps, and sets always same number so only one for loop needed
                    ex = exercises.get(i);
                    rp = reps.get(i);
                    st = sets.get(i);
                    db.addExercise(new Workout(title, ex, rp, st));

                }
                List<Workout> workouts = db.getAllExercises();

                for (Workout wo : workouts) {
                    String log = "Workout " + wo.getWorkout() + "Exercise " + wo.getExercise()  + " ,Reps " + wo.getReps() + " ,Sets " + wo.getSets();
                    // Writing workouts to log
                    Log.d("Workout ", log);
                }
                Intent intent = new Intent(this, MyWorkoutsActivity.class);
                startActivity(intent);

                return true;
@覆盖
公共布尔值onOptionsItemSelected(菜单项项){
//处理菜单项的选择
开关(item.getItemId()){
案例R.id.action\u保存:
字符串标题=MyWorkoutsActivity.workouts.get(workoutID);
字符串ex;
字符串rp;
字符串st;
SQLDatabase db=新的SQLDatabase(此);
对于(int i=0;i
之所以会发生这种情况,是因为侦听器方法afterTextChanged在键入的第一个字母后暂停,因此它会将第一个字母保存到列表中,依此类推 直到你得到一个字符列表

解决方案是:不要使用textwatcher,因为你想在用户按下save按钮时保存数据,所以按下按钮时将数据添加到练习列表中,如下代码所示:

public void onClick(View view){
    //the exercise and reps and sets are the EditText fields that you have
    exercises.add(exercise.getText());
    exercises.add(reps.getText());
    exercises.add(sets.getText());

}

之所以会发生这种情况,是因为侦听器方法afterTextChanged在键入的第一个字母之后暂停,因此它会将第一个字母保存到列表中,以此类推 直到你得到一个字符列表

解决方案是:不要使用textwatcher,因为你想在用户按下save按钮时保存数据,所以按下按钮时将数据添加到练习列表中,如下代码所示:

public void onClick(View view){
    //the exercise and reps and sets are the EditText fields that you have
    exercises.add(exercise.getText());
    exercises.add(reps.getText());
    exercises.add(sets.getText());

}

非常感谢!唯一的问题是我如何分别引用每个listview行来添加编辑文本数据?这不是一个设定的行数,行数与用户按add new的次数相同。我认为本教程会有所帮助:如果您不想动态更改列表,这将为您提供帮助(保存按钮与listview处于不同的活动中)非常感谢!唯一的问题是如何分别引用每个listview行以添加编辑文本数据