新的arraylist项目会覆盖以前的listview项目

时间:2017-02-07 16:32:59

标签: android listview android-intent arraylist android-arrayadapter

目前我正在尝试从用户输入发送意图数据以显示到我的自定义适配器上。来自detailspage.java类的用户输入的intent数据将使用自定义Arrayadapter发送到listview页面。但是,每次添加新项目时,它都会覆盖以前的条目。希望一些善良的灵魂可以帮助新手安装。

以下是我的代码片段。

    // Set a click listener on that button
    btnAddData.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            saveExercise(exerciseName);
        }
    });
}

private void saveExercise(String name) {
    // Read from input fields
    // Use trim to eliminate leading or trailing white space
    String setString = mSetEditText.getText().toString().trim();
    String repString = mRepEditText.getText().toString().trim();
    String nameString = name;


    Intent intent = new Intent(ExerciseDetailActivity.this, WorkoutSetActivity.class);

    intent.putExtra("name", nameString);
    intent.putExtra("set", setString);
    intent.putExtra("rep", repString);

    startActivity(intent);

}

意图数据将被发送到活动页面以启动自定义ArrayAdapter。

public class WorkoutSetActivity extends AppCompatActivity {

ArrayList<WorkoutSet> workout = new ArrayList<WorkoutSet>();

/** Adapter for the ListView */
WorkoutSetAdapter adapter;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.exercise_list);

    adapter = new WorkoutSetAdapter(this, workout);
    ListView listView = (ListView) findViewById(R.id.list);
    listView.setAdapter(adapter);

    Intent intent = this.getIntent();
    String name = intent.getExtras().getString("name");
    String set = intent.getExtras().getString("set");
    String rep = intent.getExtras().getString("rep");

    adapter.add(new WorkoutSet(name,set,rep));
    Toast.makeText(WorkoutSetActivity.this, "Workout added.", Toast.LENGTH_SHORT).show();
    adapter.notifyDataSetChanged();
}
}

最后是自定义ArrayAdapter代码。这是我设置自定义列表视图的地方。

public class WorkoutSetAdapter extends ArrayAdapter<WorkoutSet> {


public WorkoutSetAdapter(Activity context, ArrayList<WorkoutSet> workout) {
    super(context, 0, workout);
}

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

    // Check if the existing view is being reused, otherwise inflate the view
    View listItemView = convertView;
    if (listItemView == null) {
        listItemView = LayoutInflater.from(getContext()).inflate(
                R.layout.activity_workout_set, parent, false);
    }

    WorkoutSet currentWorkout = getItem(position);

    // Find individual views that we want to modify in the list item layout
    TextView nameTextView = (TextView) listItemView.findViewById(R.id.workout_name);
    TextView setTextView = (TextView) listItemView.findViewById(R.id.workout_set);
    TextView repTextView = (TextView) listItemView.findViewById(R.id.workout_rep);

    nameTextView.setText(currentWorkout.getName());
    setTextView.setText("Sets: "+ currentWorkout.getSet());
    repTextView.setText("Reps: "+ currentWorkout.getRep());

    return listItemView;
}
}

2 个答案:

答案 0 :(得分:0)

  

每次添加新项目时都会覆盖我以前的条目

没有“之前的条目”。 startActivity每次加载一个空适配器,你只添加一个元素。

你想要的是SQLite database(或任何持久存储层,但提供的SQLite没有更多的库)。

从好的方面来说,你的Intent和Adapter代码看起来很好。

答案 1 :(得分:0)

每次调用startActivity (),你打开一个新的WorkoutSetActivity,这是一个新的WorkoutSetActivity对象实例,所以arrayAdapter也是新的,它只会显示你这次发送的数据。

如果要显示所有数据,则必须将以前的数据保存到数据库或文件中。在WorkoutSetActivity onCreate()中,您应该获取以前的数据,将它们和当前数据放到适配器中。