无法使用 notifyDataSetChanged 刷新列表视图中已更改的数据
Unable to refresh the changed data in listview using notifyDataSetChanged
我有一个 main activity
,它有一个 listview
,它首先从这个主程序加载 activity 我正在启动一个新的 activity,我正在尝试获取通过传递 intent
将 edittext
值传递给我的主要 activity。一切正常,但是当我将 editext 值添加到列表视图时,它会添加但是当我转到 second activity
并再次添加并返回到主 activity 时,以前添加的数据不再可见并且新添加的值正在更新列表视图。
谁能帮我解决这个问题?
这是我的适配器:
public class AdapterListViewData extends BaseAdapter{
private LayoutInflater mInflater;
private Context context;
private ArrayList<DataShow> listData = new ArrayList<DataShow>();
public AdapterListViewData(Context context,ArrayList<DataShow> listData) {
this.context = context;
this.mInflater = LayoutInflater.from(context);
this.listData = listData;
}
public int getCount() {
// TODO Auto-generated method stub
return listData.size();
}
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
HolderListAdapter holderListAdapter;
if(convertView == null)
{
convertView = mInflater.inflate(R.layout.adapter_listview, null);
holderListAdapter = new HolderListAdapter();
holderListAdapter.txtTitle = (TextView) convertView.findViewById(R.id.txtTitle);
holderListAdapter.txtDetail = (TextView) convertView.findViewById(R.id.txtDetail);
holderListAdapter.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox);
convertView.setTag(holderListAdapter);
}else{
holderListAdapter = (HolderListAdapter) convertView.getTag();
}
holderListAdapter.txtTitle.setText(listData.get(position).getTitle());
holderListAdapter.txtDetail.setText(listData.get(position).getDetail());
holderListAdapter.checkBox.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(context,"CheckBox "+ position +" check!!",Toast.LENGTH_SHORT).show();
}
});
convertView.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(context,"List "+ position +" click!!",Toast.LENGTH_SHORT).show();
}
});
return convertView;
}
}
主要Activity:
public class CustomListViewActivity extends Activity {
private AdapterListViewData adapterListViewData;
private ArrayList<DataShow> listData = new ArrayList<DataShow>();
private ListView listViewData;
String AddedTask ;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent intent = getIntent();
listViewData = (ListView)findViewById(R.id.listViewData);
if (intent.hasExtra("NewTask")) {
AddedTask = this.getIntent().getExtras().getString("NewTask");
listData.add(new DataShow(AddedTask,""));
}
adapterListViewData = new AdapterListViewData(getBaseContext(),listData);
listViewData.setAdapter(adapterListViewData);
adapterListViewData.notifyDataSetChanged();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar actions click
switch (item.getItemId()) {
case R.id.action_settings:
return true;
case R.id.action_add_task:
Intent i = new Intent(CustomListViewActivity.this, AddTask.class);
startActivity(i);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
数据显示:
public class DataShow {
private String title;
private String detail;
public DataShow(String title,String detail) {
// TODO Auto-generated constructor stub
this.title = title;
this.detail = detail;
}
public String getTitle(){
return this.title;
}
public String getDetail(){
return this.detail;
}
}
持有人:
public class HolderListAdapter {
TextView txtTitle;
TextView txtDetail;
CheckBox checkBox;
}
第二个Activity:
public class AddTask extends Activity {
Button addtask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.add_task);
// get action bar
ActionBar actionBar = getActionBar();
// Enabling Up / Back navigation
actionBar.setDisplayHomeAsUpEnabled(true);
addtask = (Button) findViewById(R.id.btnaddlist);
findViewById(R.id.btnaddlist).setOnClickListener(
new View.OnClickListener() {
public void onClick(View arg0) {
EditText edit = (EditText) findViewById(R.id.tskname);
Intent i = new Intent(AddTask.this,
CustomListViewActivity.class);
//Bundle bundle = new Bundle();
String TaskName = edit.getText().toString();
//bundle.putString("NewTask", TaskName);
i.putExtra("NewTask", TaskName);
//i.putExtras(bundle);
startActivity(i);
}
});
}
}
我相信你应该在
中调用 adapterListViewData.notifyDataSetChanged();
if (intent.hasExtra("NewTask"))
{
AddedTask = this.getIntent().getExtras().getString("NewTask");
listData.add(new DataShow(AddedTask,""));
}
即
if (intent.hasExtra("NewTask"))
{
AddedTask = this.getIntent().getExtras().getString("NewTask");
listData.add(new DataShow(AddedTask,"")); // you are adding new data here
adapterListViewData.notifyDataSetChanged(); // just refresh the adapter here
}
出于调试目的,请检查 NewTask
在 MainActivity.class
中获得的值。
Log.d("track",AddedTask);
DataShow class 构造函数需要标题和详细信息。您是否检查过它是否增加了价值并且您错过了空的细节,对吗?
listData.add(new DataShow(AddedTask,""));
尝试提供静态数据。
还有一件事,在添加从 secondActivity 发回的新数据时,检查您的 adapter
是否为 null 或 not通过,
if (adapterListViewData != null) {
AddedTask = this.getIntent().getExtras().getString("NewTask");
listData.add(new DataShow(AddedTask,""));
adapterListViewData.notifyDataSetChanged();
}
else
{
adapterListViewData = new AdapterListViewData(getBaseContext(),listData);
listViewData.setAdapter(adapterListViewData);
}
您每次创建 adapterListViewData
的新实例
onCreate 被调用,这就是为什么以前的数据已被清除。
在您的 onCreate 中添加一个检查以防止这种情况发生。
if ( adapterListViewData == null )
{
adapterListViewData = new AdapterListViewData(getBaseContext(),listData);
listViewData.setAdapter(adapterListViewData);
}
您的旧数据已被删除,因为它不会传输到您创建新项目后开始的新 activity。
您应该使用 startActivityForResult
创建新任务并在 onActivityResult
中调用将新任务添加到列表 adapterListViewData
并在其中调用 notifyDataSetChanged
。
我有一个 main activity
,它有一个 listview
,它首先从这个主程序加载 activity 我正在启动一个新的 activity,我正在尝试获取通过传递 intent
将 edittext
值传递给我的主要 activity。一切正常,但是当我将 editext 值添加到列表视图时,它会添加但是当我转到 second activity
并再次添加并返回到主 activity 时,以前添加的数据不再可见并且新添加的值正在更新列表视图。
谁能帮我解决这个问题?
这是我的适配器:
public class AdapterListViewData extends BaseAdapter{
private LayoutInflater mInflater;
private Context context;
private ArrayList<DataShow> listData = new ArrayList<DataShow>();
public AdapterListViewData(Context context,ArrayList<DataShow> listData) {
this.context = context;
this.mInflater = LayoutInflater.from(context);
this.listData = listData;
}
public int getCount() {
// TODO Auto-generated method stub
return listData.size();
}
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
HolderListAdapter holderListAdapter;
if(convertView == null)
{
convertView = mInflater.inflate(R.layout.adapter_listview, null);
holderListAdapter = new HolderListAdapter();
holderListAdapter.txtTitle = (TextView) convertView.findViewById(R.id.txtTitle);
holderListAdapter.txtDetail = (TextView) convertView.findViewById(R.id.txtDetail);
holderListAdapter.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox);
convertView.setTag(holderListAdapter);
}else{
holderListAdapter = (HolderListAdapter) convertView.getTag();
}
holderListAdapter.txtTitle.setText(listData.get(position).getTitle());
holderListAdapter.txtDetail.setText(listData.get(position).getDetail());
holderListAdapter.checkBox.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(context,"CheckBox "+ position +" check!!",Toast.LENGTH_SHORT).show();
}
});
convertView.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(context,"List "+ position +" click!!",Toast.LENGTH_SHORT).show();
}
});
return convertView;
}
}
主要Activity:
public class CustomListViewActivity extends Activity {
private AdapterListViewData adapterListViewData;
private ArrayList<DataShow> listData = new ArrayList<DataShow>();
private ListView listViewData;
String AddedTask ;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent intent = getIntent();
listViewData = (ListView)findViewById(R.id.listViewData);
if (intent.hasExtra("NewTask")) {
AddedTask = this.getIntent().getExtras().getString("NewTask");
listData.add(new DataShow(AddedTask,""));
}
adapterListViewData = new AdapterListViewData(getBaseContext(),listData);
listViewData.setAdapter(adapterListViewData);
adapterListViewData.notifyDataSetChanged();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar actions click
switch (item.getItemId()) {
case R.id.action_settings:
return true;
case R.id.action_add_task:
Intent i = new Intent(CustomListViewActivity.this, AddTask.class);
startActivity(i);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
数据显示:
public class DataShow {
private String title;
private String detail;
public DataShow(String title,String detail) {
// TODO Auto-generated constructor stub
this.title = title;
this.detail = detail;
}
public String getTitle(){
return this.title;
}
public String getDetail(){
return this.detail;
}
}
持有人:
public class HolderListAdapter {
TextView txtTitle;
TextView txtDetail;
CheckBox checkBox;
}
第二个Activity:
public class AddTask extends Activity {
Button addtask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.add_task);
// get action bar
ActionBar actionBar = getActionBar();
// Enabling Up / Back navigation
actionBar.setDisplayHomeAsUpEnabled(true);
addtask = (Button) findViewById(R.id.btnaddlist);
findViewById(R.id.btnaddlist).setOnClickListener(
new View.OnClickListener() {
public void onClick(View arg0) {
EditText edit = (EditText) findViewById(R.id.tskname);
Intent i = new Intent(AddTask.this,
CustomListViewActivity.class);
//Bundle bundle = new Bundle();
String TaskName = edit.getText().toString();
//bundle.putString("NewTask", TaskName);
i.putExtra("NewTask", TaskName);
//i.putExtras(bundle);
startActivity(i);
}
});
}
}
我相信你应该在
中调用adapterListViewData.notifyDataSetChanged();
if (intent.hasExtra("NewTask"))
{
AddedTask = this.getIntent().getExtras().getString("NewTask");
listData.add(new DataShow(AddedTask,""));
}
即
if (intent.hasExtra("NewTask"))
{
AddedTask = this.getIntent().getExtras().getString("NewTask");
listData.add(new DataShow(AddedTask,"")); // you are adding new data here
adapterListViewData.notifyDataSetChanged(); // just refresh the adapter here
}
出于调试目的,请检查 NewTask
在 MainActivity.class
中获得的值。
Log.d("track",AddedTask);
DataShow class 构造函数需要标题和详细信息。您是否检查过它是否增加了价值并且您错过了空的细节,对吗?
listData.add(new DataShow(AddedTask,""));
尝试提供静态数据。
还有一件事,在添加从 secondActivity 发回的新数据时,检查您的 adapter
是否为 null 或 not通过,
if (adapterListViewData != null) {
AddedTask = this.getIntent().getExtras().getString("NewTask");
listData.add(new DataShow(AddedTask,""));
adapterListViewData.notifyDataSetChanged();
}
else
{
adapterListViewData = new AdapterListViewData(getBaseContext(),listData);
listViewData.setAdapter(adapterListViewData);
}
您每次创建 adapterListViewData
的新实例
onCreate 被调用,这就是为什么以前的数据已被清除。
在您的 onCreate 中添加一个检查以防止这种情况发生。
if ( adapterListViewData == null )
{
adapterListViewData = new AdapterListViewData(getBaseContext(),listData);
listViewData.setAdapter(adapterListViewData);
}
您的旧数据已被删除,因为它不会传输到您创建新项目后开始的新 activity。
您应该使用 startActivityForResult
创建新任务并在 onActivityResult
中调用将新任务添加到列表 adapterListViewData
并在其中调用 notifyDataSetChanged
。