简体   繁体   English

如何删除View分页器的特定位置

[英]How to delete specific position of View pager

I implement a ViewPager in my Android App. 我在Android应用程序中实现了ViewPager。 and i want to add some images in it, everything is OK(Images Add) but when i want to delete an image it's working and delete the image but its delete last one image not specific image which one i want to delete, i don't know how to get position of specific image and delete it. 我想在其中添加一些图像,一切正常(添加图像),但是当我要删除图像时,它正在工作并删除该图像,但是删除最后一个图像而不是要删除的特定图像,我不不知道如何获取特定图像的位置并将其删除。

public class PhotoAdd_Adapter extends PagerAdapter {
    private LayoutInflater inflater;
    private Context context;
    ArrayList<String> mylist;
    SharedPreferences sharedPreferences;
    JSONArray responsearray = null;
    private static final String TAG_PHOTO_ONE = "Gallery_Full";
    HashMap<String, String> get;
    LinearLayout addimages;
    String ImageID;
    ProgressBar progressBar;
    String finalimgpath, imageId;
    ImageView imageView, deletebtn;
    TextView no_image, p_id;
    private FragmentManager f_manager;
    int delPosition;

    public PhotoAdd_Adapter(Context context, ArrayList<String> mylist, FragmentManager f_manager) {
        this.f_manager = f_manager;
        this.context = context;
        this.mylist = mylist;
        inflater = LayoutInflater.from(context);
        sharedPreferences = context.getSharedPreferences(context.getString(R.string.prefs), 0);
    }
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }
    @Override
    public int getCount() {
        return mylist.size();
    }
    @Override
    public int getItemPosition(@NonNull Object object) {
        if(mylist.contains(object)){
            return mylist.indexOf(object);
        }else {
            return POSITION_NONE;
        }
//        return super.getItemPosition(object);
//        return PagerAdapter.POSITION_NONE;
    }
    @Override
    public Object instantiateItem(ViewGroup view, final int position) {
        View imageLayout = inflater.inflate(R.layout.photoadd_adapter, view, false);
        assert imageLayout != null;
        imageView = imageLayout.findViewById(R.id.image_adapter);
        deletebtn = imageLayout.findViewById(R.id.deletebtn);
        p_id = imageLayout.findViewById(R.id.p_id);
        this.delPosition = position;       
        String test = String.valueOf(mylist.get(position));
        String finalimgpaths = context.getString(R.string.moreimgpath) + test;
        Glide.with(context)
                .load(finalimgpaths)
                .into(imageView);
        view.addView(imageLayout, 0);
        deletebtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                showDialogBox();
                imageId = ImageID;
                Log.e("IMAGEIDONE", imageId);
                mylist.remove(position);
                notifyDataSetChanged();
                responsearray = responsearray(responsearray, position);
                new DeleteImage().execute(true);
            }
        });
        return imageLayout;
    }
    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view.equals(object);
    }
    @Override
    public void restoreState(Parcelable state, ClassLoader loader) {
    }
    @Override
    public Parcelable saveState() {
        return null;
    }
    class DeleteImage extends AsyncTask<Boolean, Void, String> {
        @Override
        protected String doInBackground(Boolean... booleans) {
            ProfileApi profileApi = new ProfileApi();
            String result = null;
            try {
                Log.e("IMAGEID", ImageID);
                result = profileApi.deleteImage(sharedPreferences.getString("id", ""), imageId);
                Log.e("DELETERESULT", result);
                JSONObject object = new JSONObject(result);
                if (object.getString("error").equalsIgnoreCase("false")) {

                    return "true";
                } else {
                    String errormsg = object.getString("response");
                    return errormsg;
                }
            } catch (ApiException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }
        @Override
        protected void onPostExecute(String s) {
//            ad.hide();
            super.onPostExecute(s);
            try {
                if (s != null) {
                    Toast.makeText(context, "Image Deleted", Toast.LENGTH_SHORT).show();
                }
            } catch (IllegalStateException e) {
                e.printStackTrace();
            }
        }
    }
    public static JSONArray responsearray(JSONArray jarray, int pos) {
        JSONArray Njarray = new JSONArray();
        try {
            for (int i = 0; i < jarray.length(); i++) {
                if (i != pos)
                    Njarray.put(jarray.get(i));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return Njarray;
    }
}

Your problem is that the view pager reloads before the delete image task finishes. 您的问题是在删除图像任务完成之前,重新加载了视图寻呼机。 So the same set of images are loaded but since the list size has been modified, the last image is not loaded. 因此,将加载同一组图像,但是由于已修改列表大小,因此不会加载最后一个图像。

Solution: Wait for the delete operation to finish before calling notifyDataSetChanged() on your ViewPager 解决方案:等待删除操作完成,然后在ViewPager上调用notifyDataSetChanged()

i have update your code, just try below code: 我已经更新了您的代码,只需尝试以下代码:

 public class PhotoAdd_Adapter extends PagerAdapter {
        private LayoutInflater inflater;
        private Context context;
        ArrayList<String> mylist;
        SharedPreferences sharedPreferences;
        JSONArray responsearray = null;
        private static final String TAG_PHOTO_ONE = "Gallery_Full";
        HashMap<String, String> get;
        LinearLayout addimages;
        String ImageID;
        ProgressBar progressBar;
        String finalimgpath, imageId;
        ImageView imageView, deletebtn;
        TextView no_image, p_id;
        private FragmentManager f_manager;
        int delPosition;

        public PhotoAdd_Adapter(Context context, ArrayList<String> mylist, FragmentManager f_manager) {
            this.f_manager = f_manager;
            this.context = context;
            this.mylist = mylist;
            inflater = LayoutInflater.from(context);
            sharedPreferences = context.getSharedPreferences(context.getString(R.string.prefs), 0);
        }
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }
        @Override
        public int getCount() {
            return mylist.size();
        }
        @Override
        public int getItemPosition(@NonNull Object object) {
            if(mylist.contains(object)){
                return mylist.indexOf(object);
            }else {
                return POSITION_NONE;
            }
    //        return super.getItemPosition(object);
    //        return PagerAdapter.POSITION_NONE;
        }
        @Override
        public Object instantiateItem(ViewGroup view, final int position) {
            View imageLayout = inflater.inflate(R.layout.photoadd_adapter, view, false);
            assert imageLayout != null;
            imageView = imageLayout.findViewById(R.id.image_adapter);
            deletebtn = imageLayout.findViewById(R.id.deletebtn);
            p_id = imageLayout.findViewById(R.id.p_id);
            this.delPosition = position;       
            String test = String.valueOf(mylist.get(position));
            String finalimgpaths = context.getString(R.string.moreimgpath) + test;
            Glide.with(context)
                    .load(finalimgpaths)
                    .into(imageView);
            view.addView(imageLayout, 0);
            deletebtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    //                showDialogBox();
                    imageId = ImageID;
                    Log.e("IMAGEIDONE", imageId);
                    responsearray = responsearray(responsearray, position);
                    new DeleteImage().execute(true);
                }
            });
            return imageLayout;
        }
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view.equals(object);
        }
        @Override
        public void restoreState(Parcelable state, ClassLoader loader) {
        }
        @Override
        public Parcelable saveState() {
            return null;
        }
        class DeleteImage extends AsyncTask<Boolean, Void, String> {
            @Override
            protected String doInBackground(Boolean... booleans) {
                ProfileApi profileApi = new ProfileApi();
                String result = null;
                try {
                    Log.e("IMAGEID", ImageID);
                    result = profileApi.deleteImage(sharedPreferences.getString("id", ""), imageId);
                    Log.e("DELETERESULT", result);
                    JSONObject object = new JSONObject(result);
                    if (object.getString("error").equalsIgnoreCase("false")) {

                        return "true";
                    } else {
                        String errormsg = object.getString("response");
                        return errormsg;
                    }
                } catch (ApiException e) {
                    e.printStackTrace();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                return null;
            }
            @Override
            protected void onPostExecute(String s) {
    //            ad.hide();
                super.onPostExecute(s);
                try {
                    if (s != null) {
                        Toast.makeText(context, "Image Deleted",Toast.LENGTH_SHORT).show();
                    mylist.remove(position);
                    notifyDataSetChanged();
                    }
                } catch (IllegalStateException e) {
                    e.printStackTrace();
                }
            }
        }
        public static JSONArray responsearray(JSONArray jarray, int pos) {
            JSONArray Njarray = new JSONArray();
            try {
                for (int i = 0; i < jarray.length(); i++) {
                    if (i != pos)
                        Njarray.put(jarray.get(i));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return Njarray;
        }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM