【问题标题】:Unable to refresh the changed data in listview using notifyDataSetChanged无法使用 notifyDataSetChanged 刷新列表视图中更改的数据
【发布时间】:2015-05-06 04:19:34
【问题描述】:

我有一个main activity,它有一个listview,它首先加载,我正在启动一个新活动,我试图通过传递intentedittext 值传递给我的主要活动.一切正常,但是当我将 editext 值添加到列表视图时,它的添加但是当我转到 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);
                          }
                      });

          } 

        }

【问题讨论】:

  • 所以本质上您正在丢失以前的数据,但您的新数据正在更新?
  • 我认为你应该 startActivityForResult 而不是 startActivity 来创建新任务。现在我相信你的列表中总会有一项任务。对吗?
  • 你之前的数据是持久化的吗,在添加到适配器之前检查一下吗?

标签: android listview android-intent notifydatasetchanged


【解决方案1】:

您的旧数据已被删除,因为它没有传输到您在创建新项目后开始的新活动。

您应该使用startActivityForResult 创建新任务并调用将新任务添加到onActivityResult 中的列表adapterListViewData 并在其中调用notifyDataSetChanged

【讨论】:

    【解决方案2】:

    您每次都在创建adapterListViewData 的新实例 onCreate 被调用,这就是为什么以前的数据已被清除。 在您的 onCreate 中添加一个检查以防止这种情况发生。

    if ( adapterListViewData == null )
    {
      adapterListViewData = new AdapterListViewData(getBaseContext(),listData);
      listViewData.setAdapter(adapterListViewData);
    }
    

    【讨论】:

      【解决方案3】:

      我相信你应该在

      中调用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
      
       }
      

      出于调试目的,检查NewTaskMainActivity.class 中的值。

         Log.d("track",AddedTask);
      

      DataShow 类构造函数需要标题和详细信息。您是否检查过它是否增加了价值并且您错过了空的细节?

      listData.add(new DataShow(AddedTask,""));
      

      尝试提供静态数据。

      还有一件事,当添加从 secondActivity 发回的新数据时,检查您的 adapter 是否为空

        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);
         }
      

      【讨论】:

      • 也试过了,但数据没有更新。
      • 是的,我已经检查过了。即使我传递了空数据,列表也正在使用新值更新,但旧值没有显示
      • @coder 你的问题是不显示旧数据还是不更新新数据?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      • 2018-09-23
      相关资源
      最近更新 更多