簡體   English   中英

無法使用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.classNewTask獲取的值。

   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來創建新的任務,並呼吁新任務添加到列表adapterListViewDataonActivityResult並調用notifyDataSetChanged在里面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM