Выбор нескольких элементов в виде сетки повторяется - PullRequest
0 голосов
/ 22 сентября 2018

Это первая сетка, в которой я выбрал

проблема в том, что: при прокрутке вниз, здесь выбираются случайные изображения

Я использовал библиотеку скольжения для просмотра сетки.Вот код Java для множественного выбора:

mgridview.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
        @Override
        public void onItemCheckedStateChanged(ActionMode actionMode, int i, long l, boolean b) {
            if (sel_tab2_images.contains(tab2_images.get(i))) {
                sel_count = sel_count - 1;
                actionMode.setTitle(sel_count + " images selected");
                sel_tab2_images.remove(tab2_images.get(i));
                viewprev = mgridview.getChildAt(i - mgridview.getFirstVisiblePosition());
                viewprev.setBackgroundColor(Color.WHITE);
                viewprev.setAlpha(1f);
                if(Build.VERSION.SDK_INT>=23) {
                    viewprev.setForeground(null);
                }


            } else {
                sel_count = sel_count + 1;
                actionMode.setTitle(sel_count + " images selected");
                sel_tab2_images.add(tab2_images.get(i));


                viewprev = mgridview.getChildAt(i - mgridview.getFirstVisiblePosition());
                if (viewprev != null) {

                    viewprev.setAlpha(0.5f);

                  //ImageView imageView=viewprev.findViewById(R.id.tick);

                   //Resource(R.drawable.ic_save_black_24dp);
                    if(Build.VERSION.SDK_INT>=23) {
                        viewprev.setForeground(getResources().getDrawable(R.drawable.ic_check_white_24dp));
                    }







                }
                else
                    Toast.makeText(getContext(), "Error Occured", Toast.LENGTH_SHORT).show();

            }

        }






        @Override
        public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
            MenuInflater inflater = actionMode.getMenuInflater();
            inflater.inflate(R.menu.context_action_bar, menu);
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
            return false;
        }

        @Override
        public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
            int del_count = 0;
            switch (menuItem.getItemId()) {
                case R.id.delete_action_bar:
                    for (String sel : sel_tab2_images) {
                        file = new File(sel);
                        if (file.exists()) {
                            file.delete();
                            tab2_images.remove(sel);
                            if (tab1_fragment.tab1_images.contains(sel)) {
                                tab1_fragment.tab1_images.remove(sel);
                            }
                            if (tab3_fragment.spam_list.contains(sel)) {
                                tab3_fragment.spam_list.remove(sel);
                            }
                            UpdateGallery(sel);
                            /*
                            int pos_1=tab2_images.indexOf(sel);
                            tab2_images.remove(sel);
                            adapter.notifyDataSetChanged();
                            viewprev=mgridview.getChildAt(pos_1);
                            viewprev.setBackgroundColor(Color.WHITE);
                            */

                            del_count++;
                        }
                    }

                    adapter = new ImageAdapterGridView(getContext());
                    mgridview.setAdapter(adapter);
                    Toast.makeText(getContext(), del_count + " images deleted", Toast.LENGTH_SHORT).show();
                    sel_count = 0;
                    sel_tab2_images.clear();
                    actionMode.finish();
                    break;
            }

            return true;


        }

        @Override
        public void onDestroyActionMode(ActionMode actionMode) {
        }
    });





    return view;


}

Ниже приведен код Java для Grid View.Я также попробовал @overriding getItem и getItemId методы, но он не работает.Это мое первое приложение, и я все еще учусь.Пожалуйста, помогите мне исправить это!

public class ImageAdapterGridView extends BaseAdapter {
    private Context mcontext;

    public ImageAdapterGridView(Context c) {
        mcontext = c;
    }

    public int getCount() {
        return tab2_images.size();
    }

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

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


    public View getView(int position, View convertview, ViewGroup parent) {
        ImageView imageView;
        if(convertview==null){
            imageView= new ImageView(mcontext);
            imageView.setLayoutParams(new GridView.LayoutParams(280,320));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(16,16,16,16);
        }
        else{
            imageView=(ImageView)convertview;
        }
        Glide.with(tab2_fragment.this).load("file://" + tab2_images.get(position))
                .diskCacheStrategy(DiskCacheStrategy.RESULT)
                .skipMemoryCache(true)
                .into(imageView);

        return imageView;
    }

}

@Override
public void onResume() {
    super.onResume();
    adapter = new ImageAdapterGridView(getContext());
    mgridview.setAdapter(adapter);
}

}

1 Ответ

0 голосов
/ 22 сентября 2018

Вы полагаетесь на представление в списке.В представлении списка используются повторно, поскольку они выходят за пределы экрана.Таким образом, чтобы сделать это, вы должны объявить boolean isSelected для каждого элемента (так что лучшее место для этого - ваша модель элемента, которая содержит все свойства каждой сетки) и сделать это истинным, когда пользователь выбирает элемент сетки и всегда обновляетваш вид основан на , который логический не вид.

В настоящее время ваша модель содержит только URL-адрес ваших изображений.Если вам нужно сохранить логическое значение isSelected, вы должны построить объект модели следующим образом:

public class ImageModel {
    public String url;
    public boolean isSelected;
}

, а затем использовать объекты поля в списке сетки:

public void onItemCheckedStateChanged(ActionMode actionMode, int i, long l, boolean b) {
    ImageModel image = tab2_images.get(i);
    if (image.isSelected) {
        // Image is selected you need to deselect it
    } else {
        // Image is not selected you need to select it
    }
}

В вашемАдаптер:

public View getView(int position, View convertview, ViewGroup parent) {
    // Your view construction code

    ImageModel image = tab2_images.get(i);
    if (image.isSelected) {
        // Show your check image view
    } else {
        // Image is not selected yet, hide your check image view
    }
}

Надеюсь, это поможет, но вид сетки считается устаревшим, попробуйте использовать RecyclerView, который является более эффективным и быстрым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...