Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 删除ListView中的数据库项(从ArrayAdapter创建)_Android_Listview_Android Sqlite_Android Arrayadapter - Fatal编程技术网

Android 删除ListView中的数据库项(从ArrayAdapter创建)

Android 删除ListView中的数据库项(从ArrayAdapter创建),android,listview,android-sqlite,android-arrayadapter,Android,Listview,Android Sqlite,Android Arrayadapter,我已经创建了一个数据库,它使用阵列适配器显示在列表视图中。我希望在弹出带有删除选项的上下文菜单时删除选中的列表视图项,如下所示: 我有一个类来处理所有的数据库函数,比如delete。当我使用带有按钮的普通onCLicklistener时,删除功能将正确执行,即删除正确的数据库条目并到达if(cursor.moveToFirst())行。当我使用delete菜单项时,它不会到达附加的delete handler函数中的if(cursor.moveToFirst())行,因此不会删除条目(附加在下

我已经创建了一个数据库,它使用
阵列适配器显示在
列表视图中。我希望在弹出带有删除选项的
上下文菜单时删除选中的
列表视图
项,如下所示:

我有一个类来处理所有的数据库函数,比如delete。当我使用带有按钮的普通
onCLicklistener
时,删除功能将正确执行,即删除正确的数据库条目并到达if(
cursor.moveToFirst()
)行。当我使用delete菜单项时,它不会到达附加的delete handler函数中的if(cursor.moveToFirst())行,因此不会删除条目(附加在下面的
ListView
代码段之后的是删除处理程序)

任何帮助/指导/示例都将不胜感激

My列表视图的填充方式如下:

  public class Listview extends AppCompatActivity
  {
   private ListView users;
   FloatingActionButton fab;
   MyDBHandler dbHandler;
   ArrayAdapter<String> arrayAdapter;
   String lists;


    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
       super.onCreate(savedInstanceState);

        StrictMode.ThreadPolicy policy = new 
        StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

        setContentView(R.layout.activity_listview);

       // Create back button in action bar
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);


        users = (ListView) findViewById(R.id.clientlst);

        // Floating Action bar for adding new data entries
        fab = (FloatingActionButton) findViewById(R.id.fab1);

        MyDBHandler dbHandler = new MyDBHandler(getApplicationContext());

        lists = dbHandler.loadHandler();

      //Create a list of the saved database String array items and split into 
     Strings
       ArrayList<String> list = new ArrayList<>   
       (Arrays.asList(lists.split("\n")));


        // Create the List view adapter
        arrayAdapter = new ArrayAdapter<String>(Listview.this, 
        android.R.layout.simple_list_item_1, android.R.id.text1, list)

       {
            @Override     // Edit the Text colour of the Listview items
        public View getView(int position, View convertView, ViewGroup parent) 
        {
                String Items = arrayAdapter.getItem(position);
                String[] separated = Items.split(":");
                String Name123 = separated[1];   // This will contain "Name"
                TextView textView = (TextView) super.getView(position, 
                convertView, parent);
                textView.setTextColor(Color.BLUE);
                textView.setText(Name123);
                return textView;
            }
        };

        users.setAdapter(arrayAdapter);
        registerForContextMenu(users);

    // Create an action to be performed by each click of an item in the
         users.setOnItemClickListener
               (
                     new AdapterView.OnItemClickListener()
                     {
                        @Override
                        public void onItemClick(AdapterView<?> parent, View 
                        view, int position, long id) {

                      String Items = arrayAdapter.getItem(position);
                            String[] separated = Items.split(":");
             String ip = separated[5];   // This will contain "PORT address"
             String port = separated[3]; // This will contain "IP number"
                            Toast.makeText(Listview.this, port + ip, 
                                Toast.LENGTH_LONG).show();

                        } // onItemClick

                    } // OnItemClickListener View

            ); // OnItemClickListener


    fab.setOnClickListener(new View.OnClickListener() {
                               @Override
                               public void onClick(View view)
                               {

                                   Toast.makeText(Listview.this, "Fab 
                                 Clicked", Toast.LENGTH_LONG).show();
                               }
                           }
      );
  } 

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, 
    ContextMenu.ContextMenuInfo menuInfo)
    {
      super.onCreateContextMenu(menu, v, menuInfo);

      menu.setHeaderTitle("Choose an option");
      MenuInflater inflator = getMenuInflater();
      inflator.inflate(R.menu.example_menu, menu);
  }

  @Override
  public boolean onContextItemSelected(MenuItem item)
  {

      AdapterView.AdapterContextMenuInfo info = 
     (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();

      switch (item.getItemId())
      {
          case R.id.option_1:
              arrayAdapter.getItem(info.position);

            MyDBHandler dbHandler = new MyDBHandler(getApplicationContext());

            String Items= arrayAdapter.getItem(info.position);
            String[] separated = Items.split(":");
            String ip = separated[3];                          // This will 
                                    contain "IP addr"
            String names = separated[1];                       // This will 
            contain "Name"

            Log.d("LATE",names + ip);

            dbHandler.deleteHandler(names,ip);
            arrayAdapter.notifyDataSetChanged();               // Refresh the 
            listview

            Toast.makeText(this, "Deleted", Toast.LENGTH_SHORT).show();
            Intent listviews1 = new Intent(Listview.this, Listview.class);
            startActivity(listviews1);
            return true;

        case R.id.option_2:
            Intent listviews2 = new Intent(Listview.this, Listview.class);
            startActivity(listviews2);
            Toast.makeText(this, "Updated", Toast.LENGTH_SHORT).show();
            return true;

        default:
            return super.onContextItemSelected(item);
        }


    }
}
 public void deleteHandler(String username, String IP)
  {
    //boolean result = false;

    String query = "Select*FROM " + TABLE_USER + " WHERE " + COLUMN_NAME + " 
    = '" +  String.valueOf(username) + "'" + " and " + COLUMN_ID + " = '" +  
    String.valueOf(IP) + "'";

    SQLiteDatabase db = this.getWritableDatabase();

    Cursor cursor = db.rawQuery(query, null);

    Log.d ("MEH", String.valueOf(cursor));

    User user = new User();

    if (cursor.moveToFirst())
    {
        user.setUserName(cursor.getString(2));
        user.setID(cursor.getString(3));

        db.delete(TABLE_USER, COLUMN_NAME + "=? and " + COLUMN_ID + "=?",

        new String[]
        {
                String.valueOf(user.getUserName()),
                String.valueOf(user.getID())
        });

        cursor.close();

        //result = true;
    }

    db.close();

    //return result;
   }
  • 删除此项
  • 确保列ID主键
  • 检查方法是否正在调用
你应该试试看

  public void deleteHandler(String username, String IP)
     {
        SQLiteDatabase db = this.getWritableDatabase();
                db.delete(TABLE_USER, 
                    COLUMN_NAME  + " = ? AND " + COLUMN_ID  + " = ?", 
                    new String[] {username, IP});
                db.close(); 
     } 
  • 删除此项
  • 确保列ID主键
  • 检查方法是否正在调用
你应该试试看

  public void deleteHandler(String username, String IP)
     {
        SQLiteDatabase db = this.getWritableDatabase();
                db.delete(TABLE_USER, 
                    COLUMN_NAME  + " = ? AND " + COLUMN_ID  + " = ?", 
                    new String[] {username, IP});
                db.close(); 
     } 

您没有调用任何方法从
用户的数据库中删除该项。setOnItemClickListener

当您在评论中添加内容时,您所做的只是尝试从
ActionBar
onItemClicked
方法中删除该项

在您的
监听器中执行同样的操作

更新2:需求变更

 users.setLongClickable(true);
 users.setOnItemLongClickListener(new OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) {
    //Do your tasks here


            AlertDialog.Builder alert = new AlertDialog.Builder(
                    YourActivity.this);
            alert.setTitle("Alert!!");
            alert.setMessage("Choose an option");
            alert.setPositiveButton("Edit", new OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                     //do your work here                      
                    dialog.dismiss();

                }
            });
            alert.setNegativeButton("Delete", new OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    //perform your delete callback here
                    dialog.dismiss();
                }
            });

            alert.show();

    return true;
  }
  });
users.setLongClickable(true);
users.setOnItemLongClickListener(新的OnItemLongClickListener(){
公共布尔值长单击(AdapterView父对象、视图v、整型位置、长id){
//在这里完成你的任务
AlertDialog.Builder alert=新建AlertDialog.Builder(
你的活动;
alert.setTitle(“alert!!”);
alert.setMessage(“选择一个选项”);
alert.setPositiveButton(“编辑”,新的OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
//你在这里工作吗
dialog.dismise();
}
});
alert.setNegativeButton(“删除”,新的OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
//在此处执行删除回调
dialog.dismise();
}
});
alert.show();
返回true;
}
});
更新1:回答说明

  • 原因是什么
    cursor.moveToFirst()
    不是一个好选项,因为 这是不必要的。编译器知道何时命中的确切位置 在数据库中输入。通常执行
    cursor.moveToFirst()
    当您需要遍历所有或某些数据元素时 数据库
  • “确保,
    COLUMN\u ID
    PRIMARY Key
    ”这背后的原因是为了避免在运行时添加添加项的功能时出现重复
    您没有调用任何方法从
    用户的数据库中删除该项。setOnItemClickListener

    当您在评论中添加内容时,您所做的只是尝试从
    ActionBar
    onItemClicked
    方法中删除该项

    在您的
    监听器中执行同样的操作

    更新2:需求变更

     users.setLongClickable(true);
     users.setOnItemLongClickListener(new OnItemLongClickListener() {
    public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) {
        //Do your tasks here
    
    
                AlertDialog.Builder alert = new AlertDialog.Builder(
                        YourActivity.this);
                alert.setTitle("Alert!!");
                alert.setMessage("Choose an option");
                alert.setPositiveButton("Edit", new OnClickListener() {
    
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                         //do your work here                      
                        dialog.dismiss();
    
                    }
                });
                alert.setNegativeButton("Delete", new OnClickListener() {
    
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //perform your delete callback here
                        dialog.dismiss();
                    }
                });
    
                alert.show();
    
        return true;
      }
      });
    
    users.setLongClickable(true);
    users.setOnItemLongClickListener(新的OnItemLongClickListener(){
    公共布尔值长单击(AdapterView父对象、视图v、整型位置、长id){
    //在这里完成你的任务
    AlertDialog.Builder alert=新建AlertDialog.Builder(
    你的活动;
    alert.setTitle(“alert!!”);
    alert.setMessage(“选择一个选项”);
    alert.setPositiveButton(“编辑”,新的OnClickListener(){
    @凌驾
    public void onClick(DialogInterface dialog,int which){
    //你在这里工作吗
    dialog.dismise();
    }
    });
    alert.setNegativeButton(“删除”,新的OnClickListener(){
    @凌驾
    public void onClick(DialogInterface dialog,int which){
    //在此处执行删除回调
    dialog.dismise();
    }
    });
    alert.show();
    返回true;
    }
    });
    
    更新1:回答说明

  • 原因是什么
    cursor.moveToFirst()
    不是一个好选项,因为 这是不必要的。编译器知道何时命中的确切位置 在数据库中输入。通常执行
    cursor.moveToFirst()
    当您需要遍历所有或某些数据元素时 数据库
  • “确保,
    COLUMN\u ID
    PRIMARY Key
    ”这背后的原因是为了避免在运行时添加添加项的功能时出现重复
    您没有从
    用户调用任何deleteFromDatabase方法。setOnItemClickListener
    检查我的答案。@Dennis我想在ItemClick上使用它来执行其他功能,例如移动到新活动。只有当用户“长”单击listview项时,菜单才会弹出,并带有删除选项。用你的建议答案行吗?嗯,你应该有门蒂