[英]NullPointerException in viewHolder during ListView refresh using notifyDataSetChanged
[英]Unable to refresh the changed data in listview using notifyDataSetChanged
我有一個main activity
,該main activity
具有一個首先加載的listview
,然后從該主活動中啟動一個新活動,在該活動中,我試圖通過傳遞intent
來將edittext
值獲取到主活動中。 一切正常,但是當我將editext值添加到listview時,它的添加,但是當我轉到second 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;
}
}
主要活動:
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;
}
第二項活動:
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
}
為了進行調試,請檢查MainActivity.class
為NewTask
獲取的值。
Log.d("track",AddedTask);
DataShow類的構造函數需要標題和詳細信息。 您是否檢查過它是否增加了價值,並且錯過了細節?
listData.add(new DataShow(AddedTask,""));
嘗試提供靜態數據。
還有一兩件事, 請檢查您是否adapter
添加新的數據從secondActivity發回為空或不是 ,
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);
}
每次調用onCreate時,您都在創建一個adapterListViewData
的新實例,這就是之前的數據已被清除的原因。 在您的onCreate中添加檢查以防止這種情況發生。
if ( adapterListViewData == null )
{
adapterListViewData = new AdapterListViewData(getBaseContext(),listData);
listViewData.setAdapter(adapterListViewData);
}
您的舊數據已刪除,因為它不會傳輸到創建新項目后開始的新活動。
您應該使用startActivityForResult
來創建新的任務,並呼吁新任務添加到列表adapterListViewData
在onActivityResult
並調用notifyDataSetChanged
在里面。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.