【问题标题】:Overwriting Listview when adding a new object - Android添加新对象时覆盖 Listview - Android
【发布时间】:2014-03-04 21:46:46
【问题描述】:

当我使用 putExtras() 添加来自另一个活动的对象时,Listview 会不断覆盖每个新对象。列表中列出的项目永远不会超过 1 项。

我应该怎么做才能在创建新事件时将新对象添加到列表视图中的新位置?

主要活动

public class MainActivity extends FragmentActivity implements OnClickListener {

ListView listView;
int lastIndex = -1;
ArrayList<Event> lstEvents = new ArrayList<Event>();

// detail view
TextView tvTitle, tvTime, tvDate;
ImageView img;
View vw_master;

boolean _isBack = true;

ImageButton add;

String title;
String date;
String time;

static final int PICK_CONTACT_REQUEST = 0;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    // Create the adapter to convert the array to views
    EventAdapter adapter = new EventAdapter(this, lstEvents);

    // attach adapter to a list view
    listView = (ListView) findViewById(R.id.listViewFragment);
    listView.setAdapter(adapter);

    // // get detail controls
    tvTitle = (TextView) findViewById(R.id.textViewTitle);
    tvDate = (TextView) findViewById(R.id.textViewDate);
    tvTime = (TextView) findViewById(R.id.textViewTime);

    add = (ImageButton) findViewById(R.id.add);
    add.setOnClickListener(this);

}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    switch (v.getId()) {
    case R.id.add:
        Intent intent = new Intent(this, CreateActivity.class);
        startActivityForResult(intent, RESULT_OK);
        break;
    }
}

protected void onActivityResult(int requestCode, Intent data) {
    if (requestCode == 1001) {
        // do something with data recieved
        Intent intent = getIntent();

        if (intent.getExtras() == null) {
            // Do first time stuff here
        } else {
            // Do stuff with intent data here
            Bundle b = getIntent().getExtras();
            title = b.getString("TITLE");
            time = b.getString("TIME");
            date = b.getString("DATE");

            Event newEvent = new Event();
            newEvent.set_date(date);
            newEvent.set_title(title);
            newEvent.set_time(time);

            lstEvents.add(newEvent);

            // Create the adapter to convert the array to views
            EventAdapter adapter = new EventAdapter(this, lstEvents);

            adapter.addAll(lstEvents);
            adapter.notifyDataSetChanged();

        }
    }

}

}

适配器

public class EventAdapter extends ArrayAdapter<Event> {

// View lookup cache
private static class ViewHolder {
    TextView title;
    TextView time;
    TextView date;
}

public EventAdapter(Context context, List<Event> objects) {
    super(context, R.layout.date_detail);
    // TODO Auto-generated constructor stub
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // Get the data item for this position
    Event event = getItem(position);
    // Check if an existing view is being reused, otherwise inflate the view
    ViewHolder viewHolder;
    if (convertView == null) {
        viewHolder = new ViewHolder();
        LayoutInflater inflater = LayoutInflater.from(getContext());
        convertView = inflater.inflate(R.layout.date_detail, null);
        viewHolder.title = (TextView) convertView
                .findViewById(R.id.textViewTitle);
        viewHolder.time = (TextView) convertView
                .findViewById(R.id.textViewTime);
        viewHolder.date = (TextView) convertView
                .findViewById(R.id.textViewDate);
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    // Populate the data into the template view using the data object
    viewHolder.title.setText(event._title);
    viewHolder.time.setText(event._time);
    viewHolder.date.setText(event._date);
    // Return the completed view to render on screen
    return convertView;
}

}

创建活动

public class CreateActivity extends Activity implements OnClickListener {

EditText etTitle;
Button btDate;
Button btTime;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_create);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    // /onclicklistener
    findViewById(R.id.btn_confirm).setOnClickListener(this);

    // edittexts and buttons
    btDate = (Button) findViewById(R.id.btn_date);
    etTitle = (EditText) findViewById(R.id.editTextTitle);
    btTime = (Button) findViewById(R.id.btn_time);
}

// Will be called via the onClick attribute
// of the buttons in main.xml
public void onClick(View view) {
    switch (view.getId()) {
    case R.id.btn_confirm:
         String title = etTitle.getText().toString();
         String time = btTime.getText().toString();
         String date = btDate.getText().toString();

        Log.e("LOG", title);
        Log.e("LOG", time);
        Log.e("LOG", date);



        Bundle newBundle = new Bundle();
        newBundle.putString("TITLE", title);
        newBundle.putString("TIME", time);
        newBundle.putString("DATE", date);



        Intent intent = new Intent(this, MainActivity.class);
        intent.putExtras(newBundle);
        setResult(1001, intent);
        finish();
        break;
    }

}

public void showTimePickerDialog(View v) {
    DialogFragment newFragment = new TimePickerFragment();
    newFragment.show(getFragmentManager(), "timePicker");
}

public void showDatePickerDialog(View v) {
    DialogFragment newFragment = new DatePickerFragment();
    newFragment.show(getFragmentManager(), "datePicker");
}

}

【问题讨论】:

  • 您在每次调用 CreateActivity 时都会启动一个新的 MainActivity。因此,Main 只会在 create 中生成一个结果。

标签: java android listview android-listview


【解决方案1】:

您正在使用来自CreateActivitystartActivity,这是错误的......所以下面的代码不起作用。

    Intent intent = new Intent(getApplicationContext(), MainActivity.class);
    intent.putExtras(newBundle);
    startActivity(intent);
    break;

您的 MainActivity 需要使用 startActivityForResult() 启动您的 CreateActivity。并且您的CreateActivity 必须使用setResult(...) 函数将结果返回给MainActivity,并通过您的Extras 传递一个Intent。检查documentation here

【讨论】:

  • 我更新了项目以显示我所做的所有更改。我在正确的轨道上吗?它看起来不允许我现在向列表视图添加任何内容。
【解决方案2】:

您不想将数据添加到列表您可以将日期直接添加到适配器变量您将像这样添加数据..

   adapter.add(Eventovalues); 

【讨论】:

  • 这可行,但它只是提出了我最初遇到的相同问题。通过将值添加到数组而不是将数组添加到适配器,它允许存储多个事件。
  • 我明白了你进入新的 Intent 意味着它会从你的列表中删除所有数据,因此它会丢失你应该将数组列表作为静态变量维护并更新结果的数据
  • 您将像这样使用 List 变量 Mainactivity.list.add(evento);
猜你喜欢
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
相关资源
最近更新 更多