删除一些项目后{List}刷新

时间:2015-10-19 04:26:27

标签: java android sqlite listview

大家好日子。我希望从数据库中删除一些项后刷新ListView但我在remove下面看到一条红线(无法解析)。我有以下代码。

 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listdisplay1);
        dbHelper = new MyDatabaseHelper(this);
        sqlcon = new InfoAPI(this);
        final String name1 = getIntent().getExtras().getString("name");
        BuildList(name1);

    }

    public void BuildList(String name) {
        final String name1 = name;
        sqlcon.open();
        Cursor cursor=sqlcon.readEntry(name1);

       String[] columns=new String[]{
               MyDatabaseHelper.Weather,MyDatabaseHelper.Date,MyDatabaseHelper.Status,MyDatabaseHelper.TimeIn_Info,MyDatabaseHelper.TimeOut_Info
       };

        int[] to=new int[]{
                R.id.weather,R.id.date,R.id.status,R.id.in,R.id.out
        };

        // create the adapter using the cursor pointing to the desired data
        //as well as the layout information
        dataAdapter = new SimpleCursorAdapter(
                this, R.layout.listdispaly,
                cursor,
                columns,
                to,
                0);

        ListView listView = (ListView) findViewById(R.id.listView1);
        // Assign adapter to ListView
        listView.setAdapter(dataAdapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> listView, View view,
                                    int position, long id) {
                // Get the cursor, positioned to the corresponding row in the result set
                Cursor cursor = (Cursor) listView.getItemAtPosition(position);

                // Get the state's capital from this row in the database.
                String ID =
                        cursor.getString(cursor.getColumnIndexOrThrow("_id"));
                String date1 = cursor.getString(cursor.getColumnIndexOrThrow("Date"));
                Intent intent = new Intent(ListDisplay.this, UpdatePage.class);
                intent.putExtra("name1", name1);
                intent.putExtra("date1", date1);
                intent.putExtra("ID", ID);
                startActivity(intent);
            }
        });

        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            public boolean onItemLongClick(final AdapterView<?> p, View v, final int po, long id) {
             //   final long id1=id;
                AlertDialog.Builder builder = new AlertDialog.Builder(ListDisplay.this);
                builder.setTitle("Delete");
                builder.setMessage("Are you sure you want to delete?");
                builder.setIcon(android.R.drawable.ic_dialog_alert);
                builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int ii) {

                        database = dbHelper.getWritableDatabase();
                        Cursor cursor = (Cursor) p.getItemAtPosition(po);

                        // Get the state's capital from this row in the database.
                        long ID =
                                cursor.getLong(cursor.getColumnIndexOrThrow("_id"));
                      sqlcon.delete(ID);
                       p.remove(p.getItemAtPosition(po));
                        dataAdapter.notifyDataSetChanged();



                    }
                });
                builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener()

                        {
                            public void onClick(DialogInterface dialog, int ii) {
                                dialog.dismiss();
                            }
                        }

                );
                builder.show();
                return true;
            }
        });
    }

            }

有人可以帮我解决问题吗?我是android的新手,不确定这是正确的实现方式吗?谢谢

被修改

好的,所以我确实喜欢@Sanju建议的内容,现在收到此错误

10-19 04:47:48.543    2094-2094/com.example.project.project E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.project.project, PID: 2094
    java.lang.ClassCastException: android.app.Application cannot be cast to com.example.project.project.ListDisplay
            at com.example.project.project.ListDisplay$2$1.onClick(ListDisplay.java:109)
            at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:153)
            at android.os.Handler.dispatchMessage(Handler.java:102)

代码已编辑

  database = dbHelper.getWritableDatabase();
                        Cursor cursor = (Cursor) p.getItemAtPosition(po);

                        // Get the state's capital from this row in the database.
                        long ID =
                                cursor.getLong(cursor.getColumnIndexOrThrow("_id"));
                      sqlcon.delete(ID);
                        ((ListDisplay)getApplicationContext()).finish();
                        Intent intent = new Intent(getApplicationContext(), ListDisplay.class);
                        getApplicationContext().startActivity(intent);

                    }
                });

有什么想法吗?

最新

final已添加到columnstolistView

   final String[] columns=new String[]{
           MyDatabaseHelper.Weather,MyDatabaseHelper.Date,MyDatabaseHelper.Status,MyDatabaseHelper.TimeIn_Info,MyDatabaseHelper.TimeOut_Info
   };

    final int[] to=new int[]{
            R.id.weather,R.id.date,R.id.status,R.id.in,R.id.out
    };

    // create the adapter using the cursor pointing to the desired data
    //as well as the layout information
    dataAdapter = new SimpleCursorAdapter(
            this, R.layout.listdispaly,
            cursor,
            columns,
            to,
            0);

 final   ListView listView = (ListView) findViewById(R.id.listView1);
    // Assign adapter to ListView
    listView.setAdapter(dataAdapter);

并且喜欢这个

 listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            public boolean onItemLongClick(final AdapterView<?> p, View v, final int po, long id) {
             //   final long id1=id;
                AlertDialog.Builder builder = new AlertDialog.Builder(ListDisplay.this);
                builder.setTitle("Delete");
                builder.setMessage("Are you sure you want to delete?");
                builder.setIcon(android.R.drawable.ic_dialog_alert);
                builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int ii) {

                        database = dbHelper.getWritableDatabase();
                        Cursor cursor = (Cursor) p.getItemAtPosition(po);

                        // Get the state's capital from this row in the database.
                        long ID =
                                cursor.getLong(cursor.getColumnIndexOrThrow("_id"));
                        sqlcon.delete(ID);

                    }
                });
                 Cursor cursor=sqlcon.readEntry(name1);
                dataAdapter = new SimpleCursorAdapter(
                        getApplicationContext(), R.layout.listdispaly,
                        cursor,
                        columns,
                        to, 0);
                //listView.setAdapter(null);
                listView.setAdapter(dataAdapter);

                builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener()

                        {
                            public void onClick(DialogInterface dialog, int ii) {
                                dialog.dismiss();
                            }
                        }

                );
                builder.show();
                return true;
            }
        });

一切似乎都很好。但是当我长按行并AlertDialog弹出时,所有文本都变成白色。为什么会发生这种情况?

3 个答案:

答案 0 :(得分:2)

使用此(不编译)行,您正在尝试操作列表视图:

p.remove(p.getItemAtPosition(po));

这不是它的工作原理。不要试图直接操纵视图。使用适配器为视图提供数据的想法是,您操纵数据而不是视图,然后发出信号,表明某些内容已发生变化。诀窍是知道如何发出信号。看来你的下一行就是这样:

dataAdapter.notifyDataSetChanged();

所以删除第一行(使用p.remove),它可能实际上有效。

如果这还不够(虽然我认为应该是这样),那么你可能需要用适当的新光标交换适配器中的光标,如下所示:

Cursor cursor2 = ... // create the same way you did when you created SimpleCursorAdapter
dataAdapter.changeCursor(cursor2);

在您更新的代码中:

builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int ii) {

        database = dbHelper.getWritableDatabase();
        Cursor cursor = (Cursor) p.getItemAtPosition(po);

        // Get the state's capital from this row in the database.
        long ID =
                cursor.getLong(cursor.getColumnIndexOrThrow("_id"));
        sqlcon.delete(ID);

        Cursor cursor2 = sqlcon.readEntry(name1);
        dataAdapter.changeCursor(cursor2);
    }
});

答案 1 :(得分:1)

这就是我在删除列表行时所做的事情,在你的适配器类中尝试这样的东西

delet.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View view) {
        cartdata.updateSelected(Integer.parseInt(cart_pdiscription[i]), 0);
        cartdata.deleteProduct(Integer.parseInt(cart_pdiscription[i]));                
        Intent intent = ((CartList) context).getIntent();
        ((CartList) context).finish();
        context.startActivity(intent);

    }
});

答案 2 :(得分:1)

  

我看到下方的红线被删除(无法解析)

这是因为类AdapterView没有名为remove的方法。 请参阅这些linkthis

执行代码以删除编辑中所选ID的行

     database =   dbHelper.getWritableDatabase();
                            Cursor cursor = (Cursor) p.getItemAtPosition(po);

                            // Get the state's capital from this row in the database.
                            long ID =
                                    cursor.getLong(cursor.getColumnIndexOrThrow("_id"));
                          sqlcon.delete(ID);                          

                        }
                    });
and then try this snippet

    cursor=sqlcon.readEntry(name1);
            dataAdapter = new SimpleCursorAdapter(
                    this, R.layout.listdispaly,
                    cursor,
                    columns,
                    to, 0);
    //listView.setAdapter(null);
    listView.setAdapter(dataAdapter);
  

但是当我长按行并且AlertDialog弹出时,所有文本都变成白色。为什么会发生这种情况?

我不知道为什么会这样,但这个片段可以帮助你摆脱问题

builder.setInverseBackgroundForced(true);
AlertDialog dialog = builder.create();
dialog.show();

它会强制反转背景颜色。此标记仅用于素材前主题。This method was deprecated in API level 23. This flag is only used for pre-Material themes. Instead, specify the window background using on the alert dialog theme.