【问题标题】:refreshing list view dont work after i remove item from listview从列表视图中删除项目后刷新列表视图不起作用
【发布时间】:2013-10-03 01:40:15
【问题描述】:

我的应用程序有错误。我在我的列表视图中正确添加项目并自动刷新列表视图以从列表视图中删除项目它也可以正常工作,但是如果我添加项目并删除然后刷新不起作用。抱歉我的英语如果有问题请在 cmets 中提问.实际上我想在列表视图中添加项目并按下一个按钮,所以我希望列表视图刷新。所以我使用adapter.notifyDataSetChanged();,如果我点击一个项目,它就会从列表中删除。我的问题是从列表中删除项目后自动刷新不起作用。 XML 代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<Spinner
    android:id="@+id/spinner1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

<EditText
    android:id="@+id/edit_test"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:inputType="numberSigned" >

    <requestFocus />
</EditText>

<Button
    android:id="@+id/btn_test"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button" />


<ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >
</ListView>

java代码:

    public class Test extends ListActivity {

List<String> list = new ArrayList<String>();
String       bbc  = "";
String       bbc2 = "";


@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.test);

    Button btn = (Button) findViewById(R.id.btn_test);
    final Spinner aminika = (Spinner) findViewById(R.id.spinner1);
    final EditText edit = (EditText) findViewById(R.id.edit_test);
    //for spinner
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, getResources().getStringArray(R.array.all_test));
    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    aminika.setAdapter(dataAdapter);

    //for listview
    final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, list);
    setListAdapter(adapter);

    //=================================================
    btn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            //=====
            bbc = String.valueOf(aminika.getSelectedItem());
            bbc2 = edit.getText().toString();
            list.add(bbc + " " + bbc2);
            edit.setText("");
            adapter.notifyDataSetChanged();

            //''''''''''''''''''''''''''''''''''''''
        }
    });
}


@Override
protected void onListItemClick(ListView l, View v, final int position, long id) {

    super.onListItemClick(l, v, position, id);

    final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, list);
    setListAdapter(adapter);
    //=============================
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
            Test.this);

    // set title
    alertDialogBuilder.setTitle("Your Title");

    // set dialog message
    alertDialogBuilder
            .setMessage("Click yes to remove!")
            .setCancelable(true)
            .setPositiveButton("Yes", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int id) {
                    // if this button is clicked, close
                    // current activity
                    String item = (String) getListAdapter().getItem(position);
                    list.remove(item);
                    adapter.notifyDataSetChanged();

                }
            })
            .setNegativeButton("No", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int id) {
                    // if this button is clicked, just close
                    // the dialog box and do nothing
                    dialog.cancel();

                }
            });
    // create alert dialog
    AlertDialog alertDialog = alertDialogBuilder.create();
    // show it
    alertDialog.show();
    //=====================================
}
}

我的错误是什么?

【问题讨论】:

    标签: android listview


    【解决方案1】:

    你有一个固定字符串数组,每次点击,你都会再次填充列表

    这里:

    super.onListItemClick(l, v, position, id);
    
    setListAdapter(adapter);
    //=============================
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
            Test.this);
    

    我建议您在当前会话期间使用数组列表来保存新旧数据。 这个列表是要持久化还是要在每次活动打开时恢复原样?

    【讨论】:

    • 我不保存任何更改,我希望它恢复到原始形式
    【解决方案2】:

    您不应在 onListItemClick 中创建和设置新适配器。而不是

    final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, list);
    setListAdapter(adapter);
    

    试试

    final ListAdapter adapter = l.getAdapter();
    

    你这样做的方式是在旧适配器实例上调用 onClick 中的 notifyDataSetChanged()(它不再是 ListView 的适配器,因为你在 onListItemClick 中创建并分配了一个新的适配器)。 这可以解释为什么在第一次删除后更新 ListView(添加元素后)不起作用。不过我没试过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      相关资源
      最近更新 更多