0

我有这样的问题:的ListView与ArrayAdapter和EditText上如何存储变更的数据

我创建了一个由定制ArrayAdapter一个,在其中Listview插入活动有用于增加新的按钮进入最后一个克隆的Listview

列表的行为是,当我点击添加按钮时,所有对列表视图的行所做的更改都会丢失。

我想我需要插入一些代码来保存更改到ArrayAdapter的对象,但我不能罚款做一个好的解决方案。

你能恳求给我一些建议吗?

谢谢。

ArrayAdapter

public class ExerciseAdapter extends ArrayAdapter<Exercise_p_obj> { 

private int resource; 
private LayoutInflater inflater; 
private ArrayList<Exercise_p_obj> listExercises = new ArrayList<Exercise_p_obj>(); 

public ExerciseAdapter(Context context, int resourceId, ArrayList<Exercise_p_obj> objects) { 
    super(context, resourceId, objects); 
    resource = resourceId; 
    inflater = LayoutInflater.from(context); 
    listExercises = objects; 
} 

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

    // Recuperiamo l'oggetti che dobbiamo inserire a questa posizione 
    final Exercise_p_obj exercise_p = getItem(position); 

    final ViewHolder holder; 

    if (v == null) { 
     v = inflater.inflate(resource, parent, false); 
     holder = new ViewHolder(); 
     holder.et_reps = (EditText) v.findViewById(R.id.et_reps); 
     holder.et_kg = (EditText) v.findViewById(R.id.et_kg); 
     holder.et_rest = (EditText) v.findViewById(R.id.et_rest); 
     holder.bt_del = (Button) v.findViewById(R.id.bt_del); 
     v.setTag(holder); 
    } else { 
     holder = (ViewHolder) v.getTag(); 
    } 

    holder.et_reps.setText(String.valueOf(exercise_p.getReps())); 
    holder.et_kg.setText(String.valueOf(exercise_p.getWeight())); 
    holder.et_rest.setText(String.valueOf(exercise_p.getRest())); 

    holder.bt_del.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      listExercises.remove(position); 
      notifyDataSetChanged(); 
     } 
    }); 

    return v; 
} 

private static class ViewHolder { 
EditText et_reps; 
EditText et_kg; 
EditText et_rest; 
Button bt_del;}} 

主要活动

public class ExerciseCreate extends AppCompatActivity { 
Toolbar toolbar; 
ListView listView; 
Button btAdd; 
Button btDel; 
ExerciseAdapter exerciseAdapter; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.createexercise); 
    listView = (ListView) findViewById(R.id.exerciselistView); 
    btAdd = (Button) findViewById(R.id.bt_add); 
    toolbar = (Toolbar) findViewById(R.id.app_bar); 

    exerciseAdapter = new ExerciseAdapter(this, R.layout.rowexercise,new ArrayList<Exercise_p_obj>()); 
    exerciseAdapter.add(new Exercise_p_obj(1,1,1,1,1,1)); 

    listView.setAdapter(exerciseAdapter); 
    setSupportActionBar(toolbar); 

    btAdd.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      final int count = exerciseAdapter.getCount(); 
      Exercise_p_obj clone = exerciseAdapter.getItem(count - 1); 
      exerciseAdapter.add(new Exercise_p_obj(0, clone.getId_exer_h(), clone.getReps(), clone.getSecs(), clone.getWeight(), clone.getRest())); 
     } 
    }); 

}} 
+0

在MainActivity尝试添加excerciseAdapter.notifyDataSetChanged(); – Jerry

+0

杰里我试图添加该方法,但仍然有同样的问题。我认为是关于exercise_p对象的更新。 –

+1

我解决了在EditView上使用TextWatcher。 'holder.et_reps.addTextChangedListener(新TextWatcher(){ @Override 公共无效beforeTextChanged(CharSequence中的CharSequence,INT I,INT I1,I2 INT){ } @Override 公共无效onTextChanged(CharSequence中的CharSequence ,INT I,INT I1,I2 INT){ } @Override 公共无效afterTextChanged(可编辑的编辑){ exercise_p.setReps(的Integer.parseInt(editable.toString()));} }); ' –

回答

0

使用单独的列表数据。如果要添加新的项目,你首先将它添加到列表中,然后你需要调用adapter.notifyDataSetChanged()

public class ExerciseCreate extends AppCompatActivity { 
    Toolbar toolbar; 
    ListView listView; 
    Button btAdd; 
    Button btDel; 
    ExerciseAdapter exerciseAdapter; 
    List<Exercise_p_obj> items = new ArrayList<Exercise_p_obj>(); 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.createexercise); 
     listView = (ListView) findViewById(R.id.exerciselistView); 
     btAdd = (Button) findViewById(R.id.bt_add); 
     toolbar = (Toolbar) findViewById(R.id.app_bar); 

     items.add(new Exercise_p_obj(1,1,1,1,1,1)); 
     exerciseAdapter = new ExerciseAdapter(this, R.layout.rowexercise,items); 
     listView.setAdapter(exerciseAdapter); 
     setSupportActionBar(toolbar); 

     btAdd.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       final int count = items.size(); 
       Exercise_p_obj clone = items.get(count - 1); 
       items.add(new Exercise_p_obj(0, clone.getId_exer_h(), clone.getReps(), clone.getSecs(), clone.getWeight(), clone.getRest())); 
       exerciseAdapter.notifyDataSetChanged(); 
      } 
     }); 
    } 
} 
+0

ЯрославЗозуля似乎不工作,在调试中,我看到项目ArrayList仍不会根据EditText的新值更新。我想我需要将插入到EditText中的值发送给用户进行更改时的项目。 因此,我尝试使用TextWatcher。 –

相关问题