Выбор элемента с флажком в Android-GridView - PullRequest
0 голосов
/ 03 июля 2019

У меня возникла проблема с Android GridView.Я уже пробовал различные решения от Stackoverflow, но на самом деле ни одно из них не сработало.

Я заполняю GridView с помощью ArrayAdapter.Адаптер раздувает макет, содержащий только изображение и флажок.Я использую этот "convertView", чтобы предотвратить мерцание при добавлении изображений (в GridView добавляется около 500 изображений).

Проблема : Когда я проверяюфлажок и прокрутка, проверенное состояние исчезает.Кроме того, когда я, например, проверяю несколько флажков элемента GridView, шаблон выбора бесконечно продолжается для всех следующих элементов.


Мой GridView является дочерним элементом RelativeLayout.RelativeLayout используется в качестве корневого элемента фрагмента, используемого в ViewPager:

<GridView
    android:id="@+id/MainGrid"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/appBackgroundColor"
    android:drawSelectorOnTop="false"
    android:listSelector="#00000000"
    android:numColumns="2"
    android:paddingLeft="6dp"
    android:paddingTop="5dp"
    android:paddingRight="6dp"
    android:translationZ="2dp" />

Я заполняю GridView с помощью потока, который загружает данные изображения с веб-сайта.Я думаю, что с этим не должно быть проблем, но для полноты вот код:

//Declaring the Array
ArrayList<GridImage> ImageArray = new ArrayList<>();

//And the adapter
Adapter_GridAdapter GridViewAdapter = new Adapter_GridAdapter (getActivity().getApplicationContext(), ImageArray );

//The following is executed 500 times in a thread
ImageArray.add(new GridImage(URL));
getActivity().runOnUiThread(new Runnable() {
    @Override
    public void run() {
        GridViewAdapter.notifyDataSetChanged();
    }
});

Код адаптера GridView:

public class Adapter_GridAdapter extends ArrayAdapter<GridImage> {

Context context;

public Adapter_GridAdapter (Context context, ArrayList<GridImage> SearchResults) {
    super(context, 0, SearchResults);
    this.context = context;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    LayoutInflater inflater = LayoutInflater.from(getContext());
    View view = convertView;
    if (convertView == null) {
        view = inflater.inflate(R.layout.griditem_ig_post, null);

        final ImageView ThisViewIMG = view.findViewById(R.id.GridImageView);

        //Calculating Image Height (Square Image)
        ThisViewIMG.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
            @Override
            public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
                ThisViewIMG.removeOnLayoutChangeListener(this);
                ThisViewIMG.getLayoutParams().height = ThisViewIMG.getWidth();
                ThisViewIMG.requestLayout();
            }
        });

    }

    final GridImage ThisImg = getItem(position);
    final ImageView ThumbnailImage = view.findViewById(R.id.GridImageView);

    //THIS IS THE CUSTOM CHECKBOX!
    final CustomCheckBox scb = (CustomCheckBox) view.findViewById(R.id.MyCheckBox);

    //I AM SAVING THE VALUE IN THE OBJECT (TRY #38181 THAT DIDN'T WORK)
    scb.setChecked(ThisImg.IsChecked);
    scb.setOnCheckedChangeListener(new CustomCheckBox.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CustomCheckBox checkBox, boolean isChecked) {
            Log.d("CustomCheckBox", String.valueOf(isChecked));
            ThisImg.setChecked(isChecked);
        }
    });
Glide.with(context).load(Post.IMG_ThumbnailURL).fitCenter().into(ThumbnailImage);


    return view;
}
}

Сам объектдовольно просто, проблема (я думаю) также не должна скрываться здесь:

public class GridImage{
    public String PostURL;
    public Boolean IsChecked = false;

    GridImage(String URL){
        PostURL = URL;
    }

    public void setChecked(Boolean checked) {
        IsChecked = checked;
    }
}

Что я уже пробовал:

1 Ответ

0 голосов
/ 08 июля 2019

При работе с адаптерами ListView / GridView я всегда избегаю иметь final и onCheckedChangeListener , потому что оба могут иметь проблемы, иногда даже логика кажется правильной, поэтому попробуйте код ниже:

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    LayoutInflater inflater = LayoutInflater.from(getContext());
    View view = convertView;
    if (convertView == null) {
        view = inflater.inflate(R.layout.griditem_ig_post, null);

        ImageView ThisViewIMG = view.findViewById(R.id.GridImageView);

        //Calculating Image Height (Square Image)
        ThisViewIMG.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
            @Override
            public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
                v.removeOnLayoutChangeListener(this);
                v.getLayoutParams().height = v.getWidth();
                v.requestLayout();
            }
        });

    }

    GridImage ThisImg = getItem(position);
    ImageView ThumbnailImage = view.findViewById(R.id.GridImageView);

    //THIS IS THE CUSTOM CHECKBOX!
    CustomCheckBox scb = (CustomCheckBox) view.findViewById(R.id.MyCheckBox);

    scb.setChecked(ThisImg.IsChecked);
    scb.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            CustomCheckBox cb = (CustomCheckBox)view;
            int position = (int)cb.getTag();
            GridImage ThisImg = getItem(position);
            Log.d("CustomCheckBox", String.valueOf(!ThisImg.IsChecked));
            ThisImg.setChecked(!ThisImg.IsChecked);
            cb.setChecked(ThisImg.IsChecked);
        }
    });
    Glide.with(context).load(Post.IMG_ThumbnailURL).fitCenter().into(ThumbnailImage);

    scb.setTag(position);
    return view;
}

Надеюсь, это поможет!

...