2016-01-09 2 views
1

У меня есть список, способный удалить определенное изображение через onLongClick, но он пока не работает. При тестировании появляется диалоговое окно. Если я хочу удалить или нет, я нажимаю «Да»/«ОК», и появляется тост, говорящий «Элемент удален», однако элемент все еще присутствует.** SOLVED ** Android - функция Listview .remove() работает не так, как ожидалось

ОБНОВЛЕНО (я получил удалить и удалить функцию рабочей благодаря user1140237)

ОБНОВЛЕНО ОСНОВНАЯ ДЕЯТЕЛЬНОСТЬ

private String[] FilePathStrings; 
private String[] FileNameStrings; 
private File[] listFile; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_yearbook); 
    File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"/CapturyGallery"); 

    // Check for SD Card 
    if (!Environment.getExternalStorageState().equals(
      Environment.MEDIA_MOUNTED)) { 
     Toast.makeText(this, "Error! No SDCARD Found!", Toast.LENGTH_LONG) 
       .show(); 
    } else { 
     // Locate the image folder in your SD Card 
     file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"/CapturyGallery"); 
     // Create a new folder if no folder named CapturyGallery exist 
     file.mkdirs(); 
    } 


    if (file.isDirectory()) 
    { 
     listFile = file.listFiles(); 
     // Create a String array for FilePathStrings 
     FilePathStrings = new String[listFile.length]; 
     // Create a String array for FileNameStrings 
     FileNameStrings = new String[listFile.length]; 

     for (int i = 0; i < listFile.length; i++) 
     { 
      //Get the path image file 
      FilePathStrings[i] = listFile[i].getAbsolutePath(); 
      // Get the name image file 
      FileNameStrings[i] = listFile[i].getName(); 
     } 
    } 
    Arrays.sort(listFile); 

    final ListAdapter listAdapter = new CustomAdapter(Yearbook.this, FilePathStrings, FileNameStrings); 
    ListView lv = (ListView) findViewById(R.id.ListingView); 
    lv.setAdapter(listAdapter); 

    final ArrayList<String> list = new ArrayList(Arrays.asList(FilePathStrings)); 





    lv.setOnItemClickListener(this); 
    lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) { 
      //Deletes item 
      AlertDialog.Builder adb=new AlertDialog.Builder(Yearbook.this); 
      adb.setTitle("Delete?"); 
      adb.setMessage("Are you sure you want to delete " + FileNameStrings[position]); 
      final int positionToRemove = position; 
      adb.setNegativeButton("Cancel", null); 
      adb.setPositiveButton("Ok", new AlertDialog.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        File file = new File(list.get(positionToRemove)); 
        if (file.delete()) { 
         list.remove(position); 
         ((CustomAdapter) listAdapter).updateMyData(FilePathStrings, FileNameStrings); 
         Toast.makeText(getApplicationContext(), FileNameStrings[position] + " deleted", Toast.LENGTH_LONG).show(); 
        } 


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

    }); 


} 

CUSTOMADAPTER

public class CustomAdapter extends BaseAdapter { 

private Activity activity; 
private String[] filepath; 
private String[] filename; 


private static LayoutInflater inflater = null; 

public CustomAdapter(Activity a, String[] fpath, String[] fname) { 
    activity = a; 
    filepath = fpath; 
    filename = fname; 
    inflater = (LayoutInflater) activity 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 


} 
public void updateMyData(String[] fpath, String[] fname) { 
    filepath = fpath; 
    filename = fname; 
    notifyDataSetChanged(); 
} 


@Override 
public int getCount() { 
    return filepath.length; 

} 

public Object getItem(int position) { 
    return position; 
} 

public long getItemId(int position) { 
    return position; 
} 

class MyViewHolder { 
    ImageView myImage; 
    TextView timestamp; 
    TextView myName; 
    TextView myHeader; 
    MyViewHolder(View v) { 
     myImage = (ImageView) v.findViewById(R.id.PicView); 
     timestamp = (TextView) v.findViewById(R.id.timestamp); 
     myName = (TextView) v.findViewById(R.id.myName); 
     myHeader = (TextView) v.findViewById(R.id.textSeparator); 

    } 
} 


@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View vi = convertView; 
    MyViewHolder holder = null; 
    if (vi == null) { 
     vi = inflater.inflate(R.layout.custom_row, null); 
     holder = new MyViewHolder(vi); 
     vi.setTag(holder); 
    } else { 
     holder = (MyViewHolder) vi.getTag(); 
    } 

    Bitmap bmp = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(filepath[position]),100,100); 


    holder.myImage.setImageBitmap(bmp); 
    //PicImage.setScaleType(ImageView.ScaleType.CENTER_CROP); 
    holder.myImage.setPadding(8, 8, 8, 8); 

    //Set Title 
    holder.myName.setText(filename[position]); 

    ExifInterface intf = null; 
    try { 
     intf = new ExifInterface(filepath[position]); 
    } catch(IOException e) { 
     e.printStackTrace(); 
    } 

    if(intf != null) { 
     String dateString = intf.getAttribute(ExifInterface.TAG_DATETIME); 
     holder.timestamp.setText("Date Taken: " + dateString.toString()); 
    } 


    return vi; 
} 

И так мой последний проблема в том, что enever я удаляю что-то из своего списка, он разбился. Однако файл действительно удален. Я не уверен, что такое ошибка, потому что я протестировал ее на своем мобильном телефоне.

+0

вам необходимо обновить список отображения данных в вашем классе 'CustomAdapter' и чем называть' notifyDataSetChanged() '. или, пожалуйста, напишите код «CustomAdapter» – user1140237

+0

обновленный класс CustomAdapter, пожалуйста, загляните еще раз – NewBoy

ответ

1

Вам также необходимо обновить данные списка в своем пользовательском адаптере. после удаления, чем вызов notifydatasetchanged

Держите ниже метод в вас customadapter для udpate данных списка & после этого назвать его в longpress

public void updateMyData(String[] fpath, String[] fname) { 
      filepath = fpath; 
      filename = fname; 
      notifyDataSetChanged(); 
     } 

Вы должны вызвать это от longPress

list.remove(position); 
        ((CustomAdapter)listAdapter).updateMyData(FilePathStrings, FileNameStrings); /// here in your case you need to define both array global sorry not time to clean up your code 
        Toast.makeText(getApplicationContext(), FileNameStrings[position] +" deleted",Toast.LENGTH_LONG).show(); 

ОБНОВЛЕНО

Чтобы удалить файл из указанной ссылки & обновление ListView вам необходимо удалить файл из этого местоположения первой и чем вам нужно обновить ListView

File file = new File(list.get(position)); 
      if (file.delete()) {// this will required permission in Manifest for Write_EXTERNAL_STORATE 
       // if file is deleted from SD CARD 
       list.remove(position); 
       ((CustomAdapter)listAdapter).updateMyData(FilePathStrings, FileNameStrings); /// here in your case you need to define both array global sorry not time to clean up your code 
       Toast.makeText(getApplicationContext(), FileNameStrings[position] + " deleted", Toast.LENGTH_LONG).show(); 
      } 

* CustomAdapter *

public class CustomAdapter extends BaseAdapter { 

     private Activity activity; 
     private ArrayList<String> filepath; 
     private ArrayList<String> filename; 
     private JSONArray jListData; 
     private int size = 0; 

     public CustomAdapter(Activity a, JSONArray jListData) { 
      activity = a; 
      this.jListData = jListData; 
      if (filepath != null) 
       size = jListData.length(); 


     } 

     public void updateMyData(JSONArray jListData) { 
      this.jListData = jListData; 
      size = jListData.length(); 
      notifyDataSetChanged(); 
     } 


     @Override 
     public int getCount() { 
      return size; 

     } 

     public JSONObject getItem(int position) { 
      try { 
       return (JSONObject) jListData.get(position); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     public long getItemId(int position) { 
      return position; 
     } 

     class MyViewHolder { 
      ImageView myImage; 
      TextView timestamp; 
      TextView myName; 
      TextView myHeader; 

      MyViewHolder(View v) { 
       myImage = (ImageView) v.findViewById(R.id.PicView); 
       timestamp = (TextView) v.findViewById(R.id.timestamp); 
       myName = (TextView) v.findViewById(R.id.myName); 
       myHeader = (TextView) v.findViewById(R.id.textSeparator); 

      } 
     } 


     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      View vi = convertView; 
      MyViewHolder holder = null; 
      try { 
       if (vi == null) { 
        vi = LayoutInflater.from(activity).inflate(R.layout.custom_row, parent, false); 
        holder = new MyViewHolder(vi); 
        vi.setTag(holder); 
       } else { 
        holder = (MyViewHolder) vi.getTag(); 
       } 
       JSONObject rowObject = this.jListData.getJSONObject(position); 
       Bitmap bmp = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(rowObject.optString("filename")), 100, 100); 


       holder.myImage.setImageBitmap(bmp); 
       //PicImage.setScaleType(ImageView.ScaleType.CENTER_CROP); 
       holder.myImage.setPadding(8, 8, 8, 8); 

       //Set Title 
       holder.myName.setText(rowObject.optString("filename")); 

       ExifInterface intf = null; 
       try { 
        intf = new ExifInterface(rowObject.optString("filepath")); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

       if (intf != null) { 
        String dateString = intf.getAttribute(ExifInterface.TAG_DATETIME); 
        holder.timestamp.setText("Date Taken: " + dateString.toString()); 
       } 
      } catch (JSONException e) { 
      } 


      return vi; 
     } 
    } 

АКТИВНОСТИ

private JSONArray jArrayFileData; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_yearbook); 
     File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "/CapturyGallery"); 

     // Check for SD Card 
     if (!Environment.getExternalStorageState().equals(
       Environment.MEDIA_MOUNTED)) { 
      Toast.makeText(this, "Error! No SDCARD Found!", Toast.LENGTH_LONG) 
        .show(); 
     } else { 
      // Locate the image folder in your SD Card 
      file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "/CapturyGallery"); 
      // Create a new folder if no folder named CapturyGallery exist 
      file.mkdirs(); 
     } 

     jArrayFileData = new JSONArray(); 
     if (file.isDirectory()) { 
      listFile = file.listFiles(); 
      // Create a String array for FilePathStrings 
      FilePathStrings = new String[listFile.length]; 
      // Create a String array for FileNameStrings 
      FileNameStrings = new String[listFile.length]; 

      for (int i = 0; i < listFile.length; i++) { 
       JSONObject jObject = new JSONObject(); 
       //Get the path image file 
//    FilePathStrings[i] = listFile[i].getAbsolutePath(); 
       // Get the name image file 
//    FileNameStrings[i] = listFile[i].getName(); 
       jObject.put("filepath", listFile[i].getAbsolutePath()); 
       jObject.put("filename", listFile[i].getName()); 
       jArrayFileData.put(jObject); 
      } 
     } 
//  Arrays.sort(listFile); 

     final ListAdapter listAdapter = new CustomAdapter(Yearbook.this, jArrayFileData); 
     ListView lv = (ListView) findViewById(R.id.ListingView); 
     lv.setAdapter(listAdapter); 

//  final ArrayList<String> list = new ArrayList(Arrays.asList(FilePathStrings)); 


     lv.setOnItemClickListener(this); 
     lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
      @Override 
      public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) { 
       //Deletes item 
       AlertDialog.Builder adb = new AlertDialog.Builder(Yearbook.this); 
       adb.setTitle("Delete?"); 
       adb.setMessage("Are you sure you want to delete " + FileNameStrings[position]); 
       final int positionToRemove = position; 
       adb.setNegativeButton("Cancel", null); 
       adb.setPositiveButton("Ok", new AlertDialog.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         try { 
          File file = new File(list.get(positionToRemove)); 
          if (file.delete()) { 
           Toast.makeText(getApplicationContext(), jArrayFileData.getJSONObject(position).optString("filename") + " deleted", Toast.LENGTH_LONG).show(); 
           jArrayFileData.remove(position); 
    //       list.remove(position); 
           ((CustomAdapter) listAdapter).updateMyData(jArrayFileData); 

          } 
         } catch (JSONException e) { 
         } 


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

     }); 


    } 
+0

hmm its weird, он все еще не удалял файл, несмотря на отсутствие ошибок. Я искал различные ответы, и мне любопытно, что то, что я делаю, ошибочно в этой части. final ArrayList list = new ArrayList (Arrays.asList (FilePathStrings)); , Поскольку я объявил свою String [] в Final ArrayList, чтобы использовать функцию .remove(); действительно ли этот код влияет на удаление файла? – NewBoy

+0

Это кажется довольно сложным для чего-то простого. Хорошо, поэтому я подтвердил, что удаление работает сейчас, спасибо. Но, пожалуйста, простите меня, поскольку я должен беспокоить вас за последнее. всякий раз, когда я удаляю что-то, все мое приложение разбилось.Но когда я вернулся, я могу подтвердить, что файл был удален и больше не отображается в моем списке. Поэтому я могу сказать notifyDataSetChanged(); не работал так, как планировалось. – NewBoy

+0

@NewBoy, что вы получаете? или вы можете отправить этот код .. я имею в виду обновление в вашем вопросе вашего последнего кода после обновления моих изменений. – user1140237

0

Использовать Arraylist<String> для fpath и fname в вашем коде: Затем удалить данные из списка. Используйте это:

fpath.remove(index_toDelete); 
fpath.remove(index_toDelete); 
customAdapter.notifyDataSetChanged(); 
Смежные вопросы