2016-06-03 3 views
0

Я хочу обновить/обновить данные ListView, когда ImageView щелкнет в строке списка ListView.Я хочу обновить/обновить ListView, когда элемент списка удален

Это мой класс адаптер

public class ListImageAdapter extends BaseAdapter { 

private LayoutInflater layoutInflater; 
private List<EntityObject> dataStorage; 

private Context context; 

public ListImageAdapter(Context context, List<EntityObject> customizedListView) { 
    this.layoutInflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    this.context = context; 
    this.dataStorage = customizedListView; 
} 

@Override 
public int getCount() { 
    return dataStorage.size(); 
} 

@Override 
public Object getItem(int position) { 
    return dataStorage.get(position); 
} 

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

@Override 
public View getView(int position, View convertView, final ViewGroup parent) { 
    final ViewHolder listViewHolder; 
    if(convertView == null){ 
     listViewHolder = new ViewHolder(); 
     convertView = layoutInflater.inflate(R.layout.list_images, parent, false); 

     listViewHolder.downloadedImage = (ImageView)convertView.findViewById(R.id.displayed_image); 
     listViewHolder.deleteIcon = (ImageView)convertView.findViewById(R.id.delete_image); 
     listViewHolder.imageFilename = (TextView)convertView.findViewById(R.id.downloaded_filename); 
     convertView.setTag(listViewHolder); 
    }else{ 
     listViewHolder = (ViewHolder) convertView.getTag(); 
    } 

    listViewHolder.imageFilename.setText(dataStorage.get(position).getName()); 
    Uri imageUri = Uri.fromFile(new File(Helper.PATH_TO_EXTERNAL_STORAGE + File.separator + dataStorage.get(position).getImage())); 
    Glide.with(context).load(imageUri).override(90, 90).centerCrop().into(listViewHolder.downloadedImage); 

    listViewHolder.deleteIcon.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String deleteImageName = listViewHolder.imageFilename.getText().toString(); 
      String deletePath = Helper.PATH_TO_EXTERNAL_STORAGE + File.separator + deleteImageName; 
      File deleteFile = new File(deletePath); 
      if(deleteFile.exists()){ 
       deleteFile.delete(); 
       Toast.makeText(context, "The image has been deleted", Toast.LENGTH_LONG).show(); 
      } 
     } 
    }); 
    return convertView; 
} 
public void refreshDataStorage(List<EntityObject> listObject) { 
    this.dataStorage = listObject; 
    this.notifyDataSetChanged(); 
} 

static class ViewHolder{ 

    ImageView downloadedImage; 

    ImageView deleteIcon; 

    TextView imageFilename; 
} 

Я попытался вызвать этот метод в классе активность, но она не обновляет данные ListView после удаления

public void refreshDataStorage(List<EntityObject> listObject) { 
this.dataStorage = listObject; 
this.notifyDataSetChanged(); 
} 

Этот метод вызывается в OnCreate() Способ организации деятельности

 /// add an adapter for the listView 
     workingDataSource = returnDataSource(mainStorageDirectory); 
     listImageAdapter = new ListImageAdapter(ListImagesActivity.this, workingDataSource); 
     listAllImages.setAdapter(listImageAdapter); 

     listImageAdapter.refreshDataStorage(workingDataSource); 

Любые виды помощи приветствуются

+0

Не думаю, что вам нужно позвонить refreshdatastorage в свой адаптер. – JianYA

+0

Где вы использовали метод refreshDataStorage? –

+0

В классе Activity. См. Обновление – Inducesmile

ответ

1

Как мой комментарий, вы удалили файл, однако, listObject не обновляется (его элемент не удаляется). Итак, пожалуйста, позвоните примерно так:

listObject.remove(...); 
adapter.notifyDataSetChanged(); 
0

Здесь вы идете,

@Override 
public View getView(int position, View convertView, final ViewGroup parent) { 
    final ViewHolder listViewHolder; 
    if(convertView == null){ 
     listViewHolder = new ViewHolder(); 
     convertView = layoutInflater.inflate(R.layout.list_images, parent, false); 

     listViewHolder.downloadedImage = (ImageView)convertView.findViewById(R.id.displayed_image); 
     listViewHolder.deleteIcon = (ImageView)convertView.findViewById(R.id.delete_image); 
     listViewHolder.imageFilename = (TextView)convertView.findViewById(R.id.downloaded_filename); 
     convertView.setTag(listViewHolder); 
    }else{ 
     listViewHolder = (ViewHolder) convertView.getTag(); 
    } 

    listViewHolder.imageFilename.setText(dataStorage.get(position).getName()); 
    Uri imageUri = Uri.fromFile(new File(Helper.PATH_TO_EXTERNAL_STORAGE + File.separator + dataStorage.get(position).getImage())); 
    Glide.with(context).load(imageUri).override(90, 90).centerCrop().into(listViewHolder.downloadedImage); 

    listViewHolder.deleteIcon.setTag(position); 

    listViewHolder.deleteIcon.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String deleteImageName = listViewHolder.imageFilename.getText().toString(); 
      String deletePath = Helper.PATH_TO_EXTERNAL_STORAGE + File.separator + deleteImageName; 
      File deleteFile = new File(deletePath); 
      if(deleteFile.exists()){ 
       deleteFile.delete(); 
       dataStorage.remove((Integer) v.getTag()); 
       notifyDataSetChanged(); 
      } 
     } 
    }); 
    return convertView; 
} 
+0

Ваше отредактированное решение идеально подходит, но решение @BNK появилось до вас, и оно работает. Спасибо за вашу помощь – Inducesmile

1

Pls изменение

public void refreshDataStorage(List<EntityObject> listObject) { 
    this.dataStorage.clear(); 
    this.dataStorage.addAll(listObject); 
    this.notifyDataSetChanged(); 
} 
+0

Это в основном то же самое с refreshDataStorage (List listObject) – Inducesmile

+0

Нет, потому что вы используете this.dataStorage = listObject, что означает, что вы ссылаетесь на listObject, а не на dataStorage. notifyDataSetChanged() работает только с dataStorage – phongvan