2017-10-05 3 views
-3

J'ai créé une application qui permet à l'utilisateur d'ajouter un emplacement à l'aide du sélecteur de lieu et de l'ajouter à la base de données SQLite. Afin de supprimer un élément de recyclerview, c'est ce que j'ai fait jusqu'à présent.Supprimer le dossier de la base de données sqlite par le biais de Recyclerview en android

1) L'utilisateur appuie longuement sur un élément dans la vue de recyclage et affiche une alerte avec 2 boutons (Supprimer et Annuler).

Ce que je ne peux pas-do:

1) Maintenant, je ne sais pas comment supprimer un élément de recyclerview et la base de données SQLite lorsque l'utilisateur tape sur le bouton Supprimer.

Je l'ai cherché mais je ne sais pas comment il peut être implémenté. Je poste le code pour la classe MainActivity.java, la classe PlaceDbhelper.java et la classe PlacelistAdapter.java.

classe MainActivity.java

public class MainActivity extends AppCompatActivity implements 
    ConnectionCallbacks, 
    OnConnectionFailedListener { 

// Constants 
public static final String TAG = MainActivity.class.getSimpleName(); 
private static final int PERMISSIONS_REQUEST_FINE_LOCATION = 111; 
private static final int PLACE_PICKER_REQUEST = 1; 

// Member variables 
private PlaceListAdapter mAdapter; 
private RecyclerView mRecyclerView; 
private boolean mIsEnabled; 
private GoogleApiClient mClient; 
private Geofencing mGeofencing; 

//String arr; 


/** 
* Called when the activity is starting 
* 
* @param savedInstanceState The Bundle that contains the data supplied in onSaveInstanceState 
*/ 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // Set up the recycler view 
    mRecyclerView = (RecyclerView) findViewById(R.id.places_list_recycler_view); 
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 
    mAdapter = new PlaceListAdapter(this, null); 
    mRecyclerView=(RecyclerView)findViewById(R.id.places_list_recycler_view); 
    mRecyclerView.setAdapter(mAdapter); 


    Switch onOffSwitch = (Switch) findViewById(R.id.enable_switch); 
    mIsEnabled = getPreferences(MODE_PRIVATE).getBoolean(getString(R.string.setting_enabled), false); 
    onOffSwitch.setChecked(mIsEnabled); 
    onOffSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit(); 
      editor.putBoolean(getString(R.string.setting_enabled), isChecked); 
      mIsEnabled = isChecked; 
      editor.commit(); 
      if (isChecked) mGeofencing.registerAllGeofences(); 
      else mGeofencing.unRegisterAllGeofences(); 
     } 

    }); 


      mClient = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .addApi(Places.GEO_DATA_API) 
      .enableAutoManage(this, this) 
      .build(); 

    mGeofencing = new Geofencing(this, mClient); 
    mRecyclerView.addOnItemTouchListener(new RecyclerTouchListener(this, 
      mRecyclerView, new ClickListener() { 



     public void onClick(View view, final int position) { 

      picture.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

       } 
      });*/ 

     } 
     public void onItemClick(View view, int position) { 



     } 

     @Override 
     public void onLongClick(View view, int position) { 

      final AlertDialog alertDialog =new AlertDialog.Builder(MainActivity.this).create(); 
      alertDialog.setTitle("Are you want to delete this"); 
      alertDialog.setCancelable(false); 
      alertDialog.setMessage("By deleting this, item will permanently be deleted. Are you still want to delete this?"); 
      alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "Cancel", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 



       } 
      }); 
      alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Delete", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 







       } 
      }); 
      alertDialog.show(); 
      Toast.makeText(MainActivity.this, "Long press on position :"+position, 
        Toast.LENGTH_LONG).show(); 
     } 
    })); 




     } 

/*** 
* Called when the Google API Client is successfully connected 
* 
* @param connectionHint Bundle of data provided to clients by Google Play services 
*/ 
@Override 
public void onConnected(@Nullable Bundle connectionHint) { 
    refreshPlacesData(); 
    Log.i(TAG, "API Client Connection Successful!"); 
} 

/*** 
* Called when the Google API Client is suspended 
* 
* @param cause cause The reason for the disconnection. Defined by constants CAUSE_*. 
*/ 
@Override 
public void onConnectionSuspended(int cause) { 
    Log.i(TAG, "API Client Connection Suspended!"); 
} 

/*** 
* Called when the Google API Client failed to connect to Google Play Services 
* 
* @param result A ConnectionResult that can be used for resolving the error 
*/ 
@Override 
public void onConnectionFailed(@NonNull ConnectionResult result) { 
    Log.e(TAG, "API Client Connection Failed!"); 
} 

public void refreshPlacesData() { 
    Uri uri = PlaceContract.PlaceEntry.CONTENT_URI; 
    Cursor data = getContentResolver().query(
      uri, 
      null, 
      null, 
      null, 
      null); 

    if (data == null || data.getCount() == 0) return; 
    List<String> guids = new ArrayList<String>(); 
    while (data.moveToNext()) { 
     guids.add(data.getString(data.getColumnIndex(PlaceContract.PlaceEntry.COLUMN_PLACE_ID))); 
    } 
    PendingResult<PlaceBuffer> placeResult = Places.GeoDataApi.getPlaceById(mClient, 
      guids.toArray(new String[guids.size()])); 
    placeResult.setResultCallback(new ResultCallback<PlaceBuffer>() { 
     @Override 
     public void onResult(@NonNull PlaceBuffer places) { 
      mAdapter.swapPlaces(places); 
      mGeofencing.updateGeofencesList(places); 
      if (mIsEnabled) mGeofencing.registerAllGeofences(); 
     } 
    }); 
} 


public void onAddPlaceButtonClicked(View view) { 
    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) 
      != PackageManager.PERMISSION_GRANTED) { 
     Toast.makeText(this, getString(R.string.need_location_permission_message), Toast.LENGTH_LONG).show(); 
     return; 
    } 
    try { 

     PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder(); 
     Intent i = builder.build(this); 
     startActivityForResult(i, PLACE_PICKER_REQUEST); 
    } catch (GooglePlayServicesRepairableException e) { 
     Log.e(TAG, String.format("GooglePlayServices Not Available [%s]", e.getMessage())); 
    } catch (GooglePlayServicesNotAvailableException e) { 
     Log.e(TAG, String.format("GooglePlayServices Not Available [%s]", e.getMessage())); 
    } catch (Exception e) { 
     Log.e(TAG, String.format("PlacePicker Exception: %s", e.getMessage())); 
    } 
} 


/*** 
* Called when the Place Picker Activity returns back with a selected place (or after canceling) 
* 
* @param requestCode The request code passed when calling startActivityForResult 
* @param resultCode The result code specified by the second activity 
* @param data  The Intent that carries the result data. 
*/ 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == PLACE_PICKER_REQUEST && resultCode == RESULT_OK) { 
     Place place = PlacePicker.getPlace(this, data); 
     if (place == null) { 
      Log.i(TAG, "No place selected"); 
      return; 
     } 

     String placeID = place.getId(); 

     // Insert a new place into DB 
     ContentValues contentValues = new ContentValues(); 
     contentValues.put(PlaceContract.PlaceEntry.COLUMN_PLACE_ID, placeID); 
     getContentResolver().insert(PlaceContract.PlaceEntry.CONTENT_URI, contentValues); 

     // Get live data information 
     refreshPlacesData(); 
    } 
} 

@Override 
public void onResume() { 
    super.onResume(); 

    // Initialize location permissions checkbox 
    CheckBox locationPermissions = (CheckBox) findViewById(R.id.location_permission_checkbox); 
    if (ActivityCompat.checkSelfPermission(MainActivity.this, 
      android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     locationPermissions.setChecked(false); 
    } else { 
     locationPermissions.setChecked(true); 
     locationPermissions.setEnabled(false); 
    } 

    // Initialize ringer permissions checkbox 
    CheckBox ringerPermissions = (CheckBox) findViewById(R.id.ringer_permissions_checkbox); 
    NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
    // Check if the API supports such permission change and check if permission is granted 
    if (android.os.Build.VERSION.SDK_INT >= 24 && !nm.isNotificationPolicyAccessGranted()) { 
     ringerPermissions.setChecked(false); 
    } else { 
     ringerPermissions.setChecked(true); 
     ringerPermissions.setEnabled(false); 
    } 
} 

public void onRingerPermissionsClicked(View view) { 
    Intent intent = new Intent(android.provider.Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS); 
    startActivity(intent); 
} 

public void onLocationPermissionClicked(View view) { 
    ActivityCompat.requestPermissions(MainActivity.this, 
      new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 
      PERMISSIONS_REQUEST_FINE_LOCATION); 
} 




public static interface ClickListener{ 
    public void onClick(View view,int position); 
    public void onLongClick(View view,int position); 
} 


class RecyclerTouchListener implements RecyclerView.OnItemTouchListener{ 

    private ClickListener clicklistener; 
    private GestureDetector gestureDetector; 

    public RecyclerTouchListener(Context context, final RecyclerView recycleView, final ClickListener clicklistener){ 

     this.clicklistener=clicklistener; 
     gestureDetector=new GestureDetector(context,new GestureDetector.SimpleOnGestureListener(){ 
      @Override 
      public boolean onSingleTapUp(MotionEvent e) { 
       return true; 
      } 

      @Override 
      public void onLongPress(MotionEvent e) { 
       View child=recycleView.findChildViewUnder(e.getX(),e.getY()); 
       if(child!=null && clicklistener!=null){ 
        clicklistener.onLongClick(child,recycleView.getChildAdapterPosition(child)); 
       } 
      } 
     }); 

    } 


    @Override 
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { 
     View child=rv.findChildViewUnder(e.getX(),e.getY()); 
     if(child!=null && clicklistener!=null && gestureDetector.onTouchEvent(e)){ 
      clicklistener.onClick(child,rv.getChildAdapterPosition(child)); 
     } 

     return false; 
    } 

    @Override 
    public void onTouchEvent(RecyclerView rv, MotionEvent e) { 

    } 

    @Override 
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 

    } 
} 

} 

classe PlaceDbhelper.java

public class PlaceDbHelper extends SQLiteOpenHelper { 

// The database name 
private static final String DATABASE_NAME = "location.db"; 
PlaceListAdapter obj1; 


// If you change the database schema, you must increment the database version 
private static final int DATABASE_VERSION = 1; 

// Constructor 
public PlaceDbHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase sqLiteDatabase) { 

    // Create a table to hold the places data 
    final String SQL_CREATE_PLACES_TABLE = "CREATE TABLE " + PlaceEntry.TABLE_NAME + " (" + 
      PlaceEntry._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 
      PlaceEntry.COLUMN_PLACE_ID + " TEXT NOT NULL, " + 
      "UNIQUE (" + PlaceEntry.COLUMN_PLACE_ID + ") ON CONFLICT REPLACE" + 
      "); "; 

    sqLiteDatabase.execSQL(SQL_CREATE_PLACES_TABLE); 
} 
String pe=PlaceEntry._ID.toString(); 
@Override 
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { 
    // For now simply drop the table and create a new one. 
    sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + PlaceEntry.TABLE_NAME); 
    onCreate(sqLiteDatabase); 
    } 

PlacelistAdapter.java classe

public class PlaceListAdapter extends 
RecyclerView.Adapter<PlaceListAdapter.PlaceViewHolder> { 

private Context mContext; 
private PlaceBuffer mPlaces; 
PlaceDbHelper obj1; 
RecyclerView recycleview; 

public PlaceListAdapter(Context context, PlaceBuffer places) { 
    this.mContext = context; 
    this.mPlaces = places; 
} 


@Override 
public PlaceViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    // Get the RecyclerView item layout 
    LayoutInflater inflater = LayoutInflater.from(mContext); 
    View view = inflater.inflate(R.layout.item_place_card, parent, false); 
    //final Activity activity; 
    return new PlaceViewHolder(view); 
} 


@Override 
public void onBindViewHolder(PlaceViewHolder holder, int position) { 
    String placeName = mPlaces.get(position).getName().toString(); 
    String placeAddress = mPlaces.get(position).getAddress().toString(); 
    holder.nameTextView.setText(placeName); 
    holder.addressTextView.setText(placeAddress); 
} 


public void swapPlaces(PlaceBuffer newPlaces) { 
    mPlaces = newPlaces; 
    if (mPlaces != null) { 
     // Force the RecyclerView to refresh 
     this.notifyDataSetChanged(); 
    } 
} 


@Override 
public int getItemCount() { 
    if (mPlaces == null) return 0; 
    return mPlaces.getCount(); 
} 


/** 
* PlaceViewHolder class for the recycler view item 
*/ 
class PlaceViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

    TextView nameTextView; 
    TextView addressTextView; 

    public PlaceViewHolder(final View itemView) { 
     super(itemView); 
     nameTextView = (TextView) itemView.findViewById(R.id.name_text_view); 
     addressTextView = (TextView) itemView.findViewById(R.id.address_text_view); 


    } 

    @Override 
    public void onClick(View v) { 

    } 
+0

Où est votre code pour ajouter les lieux à la base de données ?? – sumit

+0

Pour supprimer de la liste, vous pouvez faire mPlace.remove (Position); dans la boîte de dialogue d'alerte –

+0

@AmjadKhan, vous voulez dire que lorsque l'utilisateur cliquera sur le bouton de suppression, alors cet élément va disparaître du recyclerview? –

Répondre

0

Je solution pour vous, vous devez supprimer la ligne de db puis retirez-le de votre liste et après l'avoir notifié à l'adaptateur. comme ci-dessous.

Utilisez cette méthode dans votre PlaceDbhelper.java classe

public void removePlace(String placeId){ 
     SQLiteDatabase db = this.getWritableDatabase(); 
     db.delete(PlaceEntry.TABLE_NAME, PlaceEntry.COLUMN_PLACE_ID + "=\"" + placeId+"\"", null) ; 
} 

appellent maintenant cette méthode en alerte lorsque cliquez SUPPRIMER

private void deletePlace(int position){ 
     PlaceDbhelper dbHelper = new PlaceDbhelper(MainActivity.this); 
     dbHelper.removePlace(placeArraylist.get(position).getPlaceId()); 
     placeArraylist.remove(position); 
     mAdapter.notifyDataSetChanged(); 
} 

espère que cela vous aidera, si ce résoudre votre marque de problème il a approuvé. Demandez si vous avez besoin d'aide.

+0

cette méthode deleteproduct est intégré ou comment l'avez-vous utilisé ou je dois le définir quelque part –

+0

* La méthode deletePlace * devrait être utilisée dans l'alerte et la méthode * removePlace * sera dans votre assistant de base de données J'ai posté votre solution, maintenant vous devez mettre ce code dans votre projet –

+0

point mais je ne sais pas sur la méthode deleteProduct que vous avez utilisé –