使 gridview 项目可以一个接一个地点击

Making gridview items clickable one by one

关卡选择 GridView 图片

我需要让 1 级可点击,其余不可点击,当用户点击 1 级时,它应该使 2 级可点击,其余不可点击,依此类推。此外,如果用户处于第 5 级,gridview 应该可以从第 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;
}   
}

如果我没看错的话,你想要一个 "current level" 允许你 check/uncheck 任何达到该级别的网格项目并且还允许你单击下一个级别的项目来制作即新的电流水平。

如果是这样,那么通过添加一个 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" 值的字符串数组.如果您愿意,可以将其改回。

我使用了一个简单的检查列表 boolean = gridview items 并且它有效....默认情况下我将第一个值设置为 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();


               }

`