2017-12-16 3 views
0

Ich erstelle eine App, in der ich nach Dateien suchen und sie von der SDCard löschen kann. Alles funktioniert, außer dass ich Dateien, die in ListView überprüft werden, nicht löschen kann.wie lösche ich dateien von listview von menuInflater

@Override 
public View getView(final int position, View convertView, ViewGroup parent) 
{ 
    // TODO Auto-generated method stub 
    LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
    convertView = inflater.inflate(R.layout.row, parent, false); 

    viewholder = new ViewHolder(); 

    viewholder.checkbox = (CheckBox) convertView.findViewById(R.id.checkBox1); 
    viewholder.texview = (TextView) convertView.findViewById(R.id.textView1); 

    viewholder.texview.setText(modelItems.get(position)); 

    viewholder.checkbox.setChecked(checkBoxState[position]); 



    viewholder.checkbox.setOnClickListener(new View.OnClickListener(){ 

      @Override 
      public void onClick(View p1) 
      { 
       // TODO: Implement this method 
       if (((CheckBox) p1).isChecked()) 
       { 
        checkBoxState[position] = true; 
        filepath = modelItems.get(position); 
       } 
       else 
       { 
        checkBoxState[position] = false; 
       } 
      } 
     }); 
    return convertView; 
} 

Wie kann ich Dateien löschen, die in ListView ausgewählt werden und auch die ListView aktualisieren?

Hier ist der gelöschte Code, den ich ausprobiert habe, welche Änderungen sollte ich hier anwenden?

public void delete() 
{ 
    path = Environment.getExternalStorageDirectory().getAbsolutePath(); 
    for (int i=0;i < checkBoxState.length;i++) 
    { 
     if (checkBoxState[i] == true) 
     { 
      File f = new File(path + "/" + filepath); 
      if (f != null && f.exists()) 
      { 
       f.delete(); 
       modelItems.remove(modelItems.get(i)); 
      } 
     } 

    } 
    notifyDataSetChanged(); 
}  
+0

gemacht haben erstellen eine Liste. Wenn das Kontrollkästchen aktiviert ist, fügen Sie den Dateipfad zur Liste hinzu. Wenn der Benutzer das Löschen bestätigt, loop die Liste, um alle Dateipfade zu erhalten, lösche sie einzeln. Vergessen Sie nicht, das Element aus der Liste zu entfernen, wenn nicht aktiviert –

+0

Ich habe versucht, aber mein Code funktioniert nicht :( –

+0

Was passiert? Zuletzt ausgewählte Element gelöscht? –

Antwort

0

versuchen Sie dies.

for (int i = 0; i < arrayList.size(); i++) 
        { 
         View view = listview.getChildAt(i); 
         CheckBox dateChk = view.findViewById(R.id.chkDate); 

         if(dateChk.isChecked()) 
          { 
           File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + arrayList.get(i).getfilename()); 
            if (f != null && f.exists()) 
            { 
             f.delete(); 
            } 
          } 
         } 
+0

Kann nicht auf Listview zugreifen, weil es in einem anderen ist Klasse –

+0

Setzen Sie diesen Code in die Aktivitätsklasse menuInflater delete click event try it.Ich bin sicher, es getan. – sandip2601

+0

Funktioniert nicht, getfilename ist unbekannte Methode für String-Klasse –

0

In Ihrem Adapter Klasse

ArrayList<String> selectedFiles; // outside getView 

public void resetSelectedItems() 
{ 
    selectedFiles.clear(); 
} 

Innen getView

viewholder.checkbox.setOnClickListener(new View.OnClickListener(){ 

     @Override 
     public void onClick(View p1) 
     { 
      // TODO: Implement this method 
      if (((CheckBox) p1).isChecked()) 
      { 
       checkBoxState[position] = true; 
       filepath = modelItems.get(position); 
       selectedFiles.add(filepath); 
      } 
      else 
      { 
       checkBoxState[position] = false; 
       if(selectedFiles.contains(modelItems.get(position)){ 
        selectedFiles.remove(modelItems.get(position)); 
       } 
      } 
     } 
    }); 

und löschen Funktion als

public void delete() 
{ 
    path = Environment.getExternalStorageDirectory().getAbsolutePath(); 
    for (int i=0;i < selectedFiles.size();i++) 
    { 
     File f = new File(selectedFiles.get(i)+ "/" + filepath); 
     if (f != null && f.exists()) 
     { 
      f.delete(); 
      modelItems.remove(modelItems.get(i)); 
     } 
    } 
    resetSelectedItems(); 
    notifyDataSetChanged(); 
}  

bereits. Ich hoffe, Sie haben EXTERNAL_STORAGE Lese- und Schreibrechte. Und vergessen Sie nicht, initialisieren selectedFiles in Adapter-Konstruktor.

+0

Was ist Adapter in Delete-Methode? Ist es ein benutzerdefiniertes Adapterobjekt? –

+0

Ihr Löschen ist im Adapter? –

+0

Editierte Antwort auf die Annahme, dass, lösche Methode ist in Ihrer Adapterklasse –

0

Mein Problem ist jetzt fast gelöst nur eine Sache noch, dass ich nicht den Dateipfad passieren kann meinen Code, all die Datei zu löschen, die die gesuchte Zeichenfolge enthält Hier Änderungen sind i

enter code here 
public void delete() 
{ 
    for (int i=0;i < selectedFiles.size();i++) 
    { 
     String s= selectedFiles.get(i); 
     Log.d("selectedFiles.get(i)",""+s); 
     searchFileForDelete(s);  
     modelItems.remove(s); 
    } 
    resetSelectedItems(); 
    notifyDataSetChanged(); 
} 


public void displayDirectory(File dir) 
{ 
    File[] files = dir.listFiles(); 

    for (File file : files) 
    { 
     allfiles.add(file.getAbsolutePath()); 

     if (file.isDirectory()) 
     { 
      displayDirectory(file); 
      allfiles.add(file.getAbsolutePath()); 
     } 
    } 

} 


public void searchFileForDelete(String substring) 
{ 
    File f = new File(path); 
    displayDirectory(f); 
    String searchString = substring; 
    for(int i=0;i<allfiles.size();i++) 
    { 
     String tempVal = allfiles.get(i); 

     if(tempVal.contains(searchString)) 
     {    
      Log.d("tempVal",""+tempVal); 
      File dlt = new File(tempVal); 
      if(dlt!=null && dlt.exists()) 
      { 
       dlt.delete(); 
      } 
     } 
    } 
} 
Verwandte Themen