I have a bunch of images from sdcard that are loaded asynchronously into gridview. Everything works fine, but when you access the context menu with a few clicks, a long press on any image reloads all activity and loads all the images. How to prevent this?
Myadapter
public class PhotosGridViewImageAdapter extends BaseAdapter { AsyncTaskLoadFiles myAsyncTaskLoadFiles; public class AsyncTaskLoadFiles extends AsyncTask<Void, String, Void> { File targetDirector; PhotosGridViewImageAdapter myTaskAdapter; public AsyncTaskLoadFiles(PhotosGridViewImageAdapter adapter) { myTaskAdapter = adapter; } @Override protected void onPreExecute() { String ExternalStorageDirectoryPath = Environment .getExternalStorageDirectory().getAbsolutePath(); String targetPath = ExternalStorageDirectoryPath + File.separator + AppConstant.PHOTO_ALBUM + File.separator; targetDirector = new File(targetPath); myTaskAdapter.clear(); super.onPreExecute(); } @Override protected Void doInBackground(Void... params) { File[] files = targetDirector.listFiles(); Arrays.sort(files); for (File file : files) { publishProgress(file.getAbsolutePath()); if (isCancelled()) break; } return null; } @Override protected void onProgressUpdate(String... values) { myTaskAdapter.add(values[0]); super.onProgressUpdate(values); } @Override protected void onPostExecute(Void result) { myTaskAdapter.notifyDataSetChanged(); super.onPostExecute(result); } } ArrayList<String> itemList = new ArrayList<String>(); void add(String path) { itemList.add(path); } void clear() { itemList.clear(); } void remove(int index){ itemList.remove(index); } private Activity _activity; private ArrayList<String> _filePaths = new ArrayList<String>(); private int imageWidth; public PhotosGridViewImageAdapter(Activity activity, ArrayList<String> filePaths, int imageWidth) { this._activity = activity; this._filePaths = filePaths; this.imageWidth = imageWidth; } @Override public int getCount() { return this._filePaths.size(); } @Override public Object getItem(int position) { return this._filePaths.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; final ImageView imageView; if (convertView == null) { imageView = new ImageView(_activity); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); imageView.setLayoutParams(new GridView.LayoutParams(imageWidth, imageWidth)); convertView = imageView; holder = new ViewHolder(); holder.image = imageView; holder.position = position; convertView.setTag(holder); } else {
Context Menu Code
public class MultiChoiceModeListener implements GridView.MultiChoiceModeListener { public boolean onCreateActionMode(ActionMode mode, Menu menu) { MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.contextual_action_menu, menu); //mode.setTitle("Select Items"); mode.setTitle("1 item selected"); return true; } public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return true; } public boolean onActionItemClicked(ActionMode mode, MenuItem item) { // Respond to clicks on the actions in the CAB switch (item.getItemId()) { case R.id.delete: SparseBooleanArray checked = gridView.getCheckedItemPositions(); try { int len = checked.size(); for (int i = 0; i < len; i++) { if (checked.valueAt(i)) { Integer position = checked.keyAt(i); //deleteToMessageHistory(position); } } }catch (Exception i){ Toast.makeText(PhotosGridViewActivity.this, "Message was not deleted. Try again.", Toast.LENGTH_SHORT).show(); } mode.finish(); // Action picked, so close the CAB return true; default: return false; } } public void onDestroyActionMode(ActionMode mode) { } public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { int selectCount = gridView.getCheckedItemCount(); switch (selectCount) { case 1: mode.setTitle("1 item selected"); break; default: mode.setTitle("" + selectCount + " items selected"); break; } } }
I appreciate any help!
== UPDATE ==
Here is the MainActivity code:
public class PhotosGridViewActivity extends Activity { private PhotosUtils utils; private ArrayList<String> imagePaths = new ArrayList<String>(); private PhotosGridViewImageAdapter adapter; private GridView gridView; private int columnWidth; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Initilizing Grid View InitilizeGridLayout(); } private void InitilizeGridLayout() { setContentView(R.layout.photos_grid_view); utils = new PhotosUtils(PhotosGridViewActivity.this); gridView = (GridView) findViewById(R.id.grid_view); // loading all image paths from SD card imagePaths = utils.getFilePaths(); Resources r = getResources(); float padding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, AppConstant.GRID_PADDING, r.getDisplayMetrics()); columnWidth = (int) ((utils.getScreenWidth() - ((AppConstant.NUM_OF_COLUMNS + 1) * padding)) / AppConstant.NUM_OF_COLUMNS); gridView.setNumColumns(AppConstant.NUM_OF_COLUMNS); gridView.setColumnWidth(columnWidth); gridView.setStretchMode(GridView.NO_STRETCH); gridView.setPadding((int) padding, (int) padding, (int) padding, (int) padding); gridView.setHorizontalSpacing((int) padding); gridView.setVerticalSpacing((int) padding); gridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL); gridView.setMultiChoiceModeListener(new MultiChoiceModeListener()); // Gridview adapter adapter = new PhotosGridViewImageAdapter(PhotosGridViewActivity.this, imagePaths, columnWidth); // setting grid view adapter gridView.setAdapter(adapter); gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int position, long id) { gridView.getItemAtPosition(position); Intent i = new Intent(PhotosGridViewActivity.this, PhotosScreenViewActivity.class); i.putExtra("position", position); PhotosGridViewActivity.this.startActivity(i); } }); } public class MultiChoiceModeListener implements GridView.MultiChoiceModeListener { public boolean onCreateActionMode(ActionMode mode, Menu menu) { MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.contextual_action_menu, menu); //mode.setTitle("Select Items"); mode.setTitle("1 item selected"); return true; } public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return true; } public boolean onActionItemClicked(ActionMode mode, MenuItem item) { // Respond to clicks on the actions in the CAB switch (item.getItemId()) { case R.id.delete: SparseBooleanArray checked = gridView.getCheckedItemPositions(); try { int len = checked.size(); for (int i = 0; i < len; i++) { if (checked.valueAt(i)) { Integer position = checked.keyAt(i); //deleteToMessageHistory(position); } } }catch (Exception i){ Toast.makeText(PhotosGridViewActivity.this, "Message was not deleted. Try again.", Toast.LENGTH_SHORT).show(); } mode.finish(); // Action picked, so close the CAB return true; default: return false; } } public void onDestroyActionMode(ActionMode mode) { } public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { int selectCount = gridView.getCheckedItemCount(); switch (selectCount) { case 1: mode.setTitle("1 item selected"); break; default: mode.setTitle("" + selectCount + " items selected"); break; } } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(co.glurl.appoid.R.menu.photo_gallery, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.add: /** Go to the user add photos. */ startActivity(new Intent(this, PhotoIntentActivity.class)); break; //case R.id.settings: /** Go to the user settings photos. */ // startActivity(new Intent(this, PhotoGridSettings.class)); // break; default: return super.onContextItemSelected(item); } return true; } }