【问题标题】:Making gridview items clickable one by one使gridview项目可一一点击
【发布时间】:2018-12-31 12:36:45
【问题描述】:

Level Selection 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;
}   
}

【问题讨论】:

  • 到目前为止你做了什么来达到同样的效果?
  • 禁用所有项目,然后只启用您需要可点击的项目。
  • 你的gridView有什么模型吗?分享一些代码,以便我们为您提供帮助:)
  • 有什么想法......?
  • @AbdulManan 如何在onItemClick() 中将position 与您当前的级别进行比较并决定是否处理点击事件?您具体面临什么挑战?

标签: android gridview adapter onitemclicklistener


【解决方案1】:

如果我没看错,您需要一个“当前级别”,允许您选中/取消选中该级别之前的任何网格项目,并允许您单击下一个级别的项目以使其成为新的当前级别.

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

【讨论】:

    【解决方案2】:

    我使用了一个简单的检查列表 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();
    
    
                   }
    

    `

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 2019-07-21
      • 2019-10-12
      • 2014-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多