【问题标题】:Refresh ListView from ArrayAdapter从 ArrayAdapter 刷新 ListView
【发布时间】:2012-08-02 21:27:23
【问题描述】:

我使用ArrayAdapter 将我的数据从我的ArrayList 绑定到我的ListView,我使用AlertDialog 将数据插入我的Arraylist。我的问题是更改完成后我无法刷新我的ListView

代码

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.config_hidden);
    listView=(ListView) findViewById(R.id.hiddenList);
    xmlFileManager=new XmlFileManager(this);
    addNumber=(Button) findViewById(R.id.addNum);

    addNumber.setOnClickListener(new OnClickListener() {

        public void onClick(View arg0) {

            LayoutInflater factory = LayoutInflater.from(HiddenCall.this);
            final View alertDialogView = factory.inflate(R.layout.add_number, null);
            AlertDialog.Builder adb = new AlertDialog.Builder(HiddenCall.this);
            adb.setView(alertDialogView);
            adb.setTitle(R.string.dialog_title);
            adb.setIcon(R.drawable.phone);

            final AlertDialog alertDialog = adb.create();

            adb.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    numberToAdd=(EditText) alertDialogView.findViewById(R.id.numberToAdd);
                    String number = numberToAdd.getText().toString();
                    if(number.length()>0){
                        xmlFileManager.addNumberToXml(number , HIDDEN_NUMBER_TYPE);
                        adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, xmlFileManager.getHiddenNumbers());
                        adapter.setNotifyOnChange(true);
                        adapter.notifyDataSetChanged();
                    }
                } });

            adb.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    alertDialog.dismiss();
                } });
            adb.show();
        }
    });
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, xmlFileManager.getHiddenNumbers());
    adapter.notifyDataSetChanged();
    adapter.setNotifyOnChange(true);
    listView.setAdapter(adapter);
}

【问题讨论】:

  • 为什么每次都创建一个新的适配器而不是修改现有的?如果您刚刚创建了适配器,您对 notifyDataSetChanged() 的调用将毫无用处..
  • 我看到您缺少的另一件事是将适配器设置为列表视图...
  • 我发布了代码,希望对您有所帮助。您仍然需要向适配器添加某种 setter 并将更新的数据传递给那里。

标签: android android-listview android-arrayadapter


【解决方案1】:

您每次都在实例化一个新适配器。您需要做的是将实例化适配器的行放在单击侦听器之前,然后在单击侦听器中修改该适配器并在其上调用 notifyDataSetChanged()。您当然必须向适配器添加一些设置器才能修改数据。

必须看起来像这样:

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.config_hidden);
listView=(ListView) findViewById(R.id.hiddenList);

//instantiate the adapter (just one time)
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, xmlFileManager.getHiddenNumbers());

//assign the adapter to the listview
listView.setAdapter(adapter);

xmlFileManager=new XmlFileManager(this);
addNumber=(Button) findViewById(R.id.addNum);

addNumber.setOnClickListener(new OnClickListener() {

    public void onClick(View arg0) {

        LayoutInflater factory = LayoutInflater.from(HiddenCall.this);
        final View alertDialogView = factory.inflate(R.layout.add_number, null);
        AlertDialog.Builder adb = new AlertDialog.Builder(HiddenCall.this);
        adb.setView(alertDialogView);
        adb.setTitle(R.string.dialog_title);
        adb.setIcon(R.drawable.phone);

        final AlertDialog alertDialog = adb.create();



        adb.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                numberToAdd=(EditText) alertDialogView.findViewById(R.id.numberToAdd);
                String number = numberToAdd.getText().toString();
                if(number.length()>0){
                    xmlFileManager.addNumberToXml(number , HIDDEN_NUMBER_TYPE);
                    //adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, xmlFileManager.getHiddenNumbers());
                    //adapter.setNotifyOnChange(true);

                    //set the changed data
                    adapter.setData(xmlFileManager.getHiddenNumbers());

                    //notify that the model changed
                    adapter.notifyDataSetChanged();
                }
            } });

        adb.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                alertDialog.dismiss();
            } });
        adb.show();
    }
});

//adapter.notifyDataSetChanged();
//adapter.setNotifyOnChange(true);

【讨论】:

  • @lxx ArrayAdapter没有方法setData
  • 啊,是的,你实际上不必在ArrayAdapter中设置数据。更新底层数组就足够了,你已经在做addNumberToXml()。所以只需删除 setData() 行。告诉我这是否有效。
  • 我假设传递给 xmlFileManager 的隐藏数字数组总是相同的。如果再次创建实例,适配器将不会注意到更改。
  • 我试图打电话给notifyDataSetChanged,但它似乎没有考虑到变化。为了解决这个问题,我更喜欢创建一个扩展BaseAdapterListAdapter,现在它可以工作了。感谢您的回复。
  • 是的,如果您说阵列适配器未显示更改,我将告诉您这是 B 计划。您应该发布完整的代码,无法知道您传递的数组是否始终是相同的引用。无论如何,这个答案向您展示了使用适配器的原则(也适用于自定义适配器),我至少应该得到 +1。如果您不发布完整的代码,则无法告诉您确切的解决方案。
【解决方案2】:

如果您有一个小的 ArrayList,要在 ArrayList 更改时强制更新 ListView,您可以使用以下代码 sn-p:

ArrayAdapter.clear();
ArrayAdapter.addAll(ArrayList);
ArrayAdapter.notifyDataSetChanged();

【讨论】:

  • “小”是什么意思?即使对于大型列表(10 000 项),它看起来也不错。当然,在仅更新一项(例如)之后刷新整个列表并不是一个好习惯。应用程序架构让我暂时使用它。 :-)
【解决方案3】:

每次点击都会创建新的适配器。你不需要这样做。您可以修改现有适配器数据并调用 notifyDataSetChanged()。在您的情况下,您应该在 onClick 方法中调用 listView.setAdapter(adapter)。

【讨论】:

  • @lxx 他不应该在 onCreate() 中设置适配器并在 onClick() 中修改它吗?
  • 就是我说的,创建设置一次,在onClick()中修改(并调用notifyDataSetChanged())。
【解决方案4】:

在您的adb.setPositiveButton()onClick() 中,您不应创建新的适配器。删除这一行:

adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, xmlFileManager.getHiddenNumbers());

只需这样做:

if(number.length()>0){
    xmlFileManager.addNumberToXml(number , HIDDEN_NUMBER_TYPE);
    adapter.notifyDataSetChanged();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多