Делаем элементы gridview кликабельными по одному - PullRequest
0 голосов
/ 31 декабря 2018

Выбор уровня изображения GridView

enter image description here

Мне нужно сделать уровень 1 активируемым, а остальные - нетактивными, а когда пользователь нажимает уровень 1, он должен получить уровень 2кликабельны, остальные не кликабельны и т. д.Кроме того, если пользователь находится на уровне 5, вид сетки должен быть активным с уровня 1 до 4

myAdapter = new MyCustomAdapter(getActivity());
    gridView.setAdapter(myAdapter);


    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id)
        {

               //do something

                       }

private class MyCustomAdapter extends BaseAdapter {

    private LayoutInflater mInflater;

    public MyCustomAdapter(Context context) {
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        GridObject object = my.get(position);
        GridObject revers=reverseobj.get(position);
        ViewHolder holder;

        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_item_icon_set, null);
            holder = new ViewHolder();
            holder.text = (ImageView) convertView.findViewById(R.id.text);
            convertView.setTag(holder);
        }
        else
        {
            holder = (ViewHolder) convertView.getTag();
        }

        if (check.get(position).equals("true"))
        {
            holder.text.setImageResource(revers.getName());
        }
        else {
            holder.text.setImageResource(object.getName());

        }
        return convertView;
    }

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

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

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


public class GridObject extends ArrayList<GridObject> {

private int image;
private int state;

public GridObject(int name, int state) {
    super();
    this.image = name;
    this.state = state;
}

public int getName() {
    return image;
}

public void setName(int name) {
    this.image = name;
}

public int getState() {
    return state;
}

public void setState(int state) {
    this.state = state;
}   
}

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Я использовал простой список проверки boolean = gridview items и It Works .... По умолчанию я установил первое значение true, а остальное значение false .......

           gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
              @Override
              public void onItemClick(AdapterView<?> parent, View view, int position, long 
        id)
        {


               if (clickcheck.get(position).equals(true)) {
                 //complete some task then

                      position=position+1;
                clickcheck.remove(position);
                clickcheck.add(position,true);
               }
               else
               {
                   Toast.makeText(getActivity(), "Click On Level "+position, Toast.LENGTH_SHORT).show();


               }

`

0 голосов
/ 01 января 2019

Если я правильно прочитал, вам нужен «текущий уровень», который позволяет вам проверять / снимать отметку с любого элемента сетки до этого уровня, а также нажимать на элемент для следующего уровня, чтобы сделать этот новый текущий уровень,

Если это так, то можно легко изменить свой адаптер, добавив переменную currentLevel и изменив значение getView(), чтобы разрешить нажатие на элементы до этого уровня и включительно.

Вот обновленная версия вашего адаптера, показывающая это:

private class MyCustomAdapter extends BaseAdapter implements AdapterView.OnItemClickListener {

    private LayoutInflater mInflater;
    // implement check as boolean array rather than what appears to be string array
    private final SparseBooleanArray check  = new SparseBooleanArray();
    // keep track of the current level
    private int currentLevel = 0;

    public MyCustomAdapter(Context context) {
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        GridObject object = my.get(position);
        GridObject revers = reverseobj.get(position);
        ViewHolder holder;

        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_item_icon_set, null);
            holder = new ViewHolder();
            holder.text = (ImageView) convertView.findViewById(R.id.text);
            convertView.setTag(holder);
        }
        else
        {
            holder = (ViewHolder) convertView.getTag();
        }

        if (check.get(position))  // used to be ...equals("true")
        {
            holder.text.setImageResource(revers.getName());
        }
        else {
            holder.text.setImageResource(object.getName());
        }
        // make items up to current level clickable
        convertView.setClickable(currentLevel < position);
        // show unclickable items as disabled
        convertView.setEnabled(currentLevel >= position);
        return convertView;
    }

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

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

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

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        // increase the current level if the item for the current level is clicked
        currentLevel = Math.max(currentLevel, position + 1);
        // toggle the checked state for the clicked item
        check.put(position, !check.get(position, false));
        // refresh the views
        notifyDataSetChanged();
    }

}

Затем вы можете включить это в GridView таким же образом, как и раньше:

myAdapter = new MyCustomAdapter(getActivity());
gridView.setAdapter(myAdapter);
gridView.setOnItemClickListener(myAdapter); 

Обратите внимание, что я реализовал отсутствующий список check как SparseBooleanArray, а не как массив строк со значениями "true" и "false" в вашей версии.Вы можете изменить его обратно, если хотите.

...