Android - 从getView()里面删除GridView项目?

时间:2013-07-20 20:05:49

标签: android gridview

我需要一种从GridView中删除Item的方法,但这必须在我的自定义Adapter中的getView()方法中完成。这是我的GridView:

活动:

    ...
    String[] newList;
    newList[0] = "Item 1";
    newList[1] = "Item 2";
    newList[2] = "Item 3";
    ...
    GridView GV = (GridView) getActivity().findViewById(R.id.gv);
    GV.setAdapter(new Adapter(getActivity(), newList));
    GV.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView arg0, 
            View arg1, int position, long arg3) {
            ...
        }
    });

适配器

public class Adapter extends BaseAdapter {

    private Context mContext;
    private LayoutInflater mInflator;
    private String mEntries[];

    public static class ViewHolder {
        public TextView myTextView;
    }

    public Adapter (Context context, String[] entries) {
        mContext = context;
        mInflator = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mEntries = entries; 
    }

    @Override
    public int getCount() {
        return mEntries.length;
    }

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

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

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

        ViewHolder holder = null;
        if(convertView == null) {
            convertView = mInflator.inflate(R.layout.gvitemlayout, parent, false);
            holder = new ViewHolder();
            holder.myTextView = (TextView) convertView.findViewById(R.list.removeItem);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        String string = mEntries[position];
        String[] data = string.split("\\.");

        if (data.length < 2) {
            TextView itemName = (TextView) convertView.findViewById(R.list.itemName);
            itemName.setText("");
            TextView itemClass = (TextView) convertView.findViewById(R.favlist.itemClass);
            itemClass.setText("");
            holder.myTextView.setText("");
            TextView itemNone = (TextView) convertView.findViewById(R.list.itemNone);
            itemNone.setText("No Items");
        } else {
            TextView itemName = (TextView) convertView.findViewById(R.list.itemName);
            itemName.setText(data[1]);
            TextView itemClass = (TextView) convertView.findViewById(R.list.itemClass);
            itemClass.setText(data[0]);
        }

        final int info = (Integer) getItem(position);
        holder.myTextView.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {               
                SharedPreferences sP = mContext.getSharedPreferences("fav", mContext.MODE_PRIVATE);
                Boolean b = sP.getBoolean(mEntries[info], false);
                if (b == true) {
                    SharedPreferences.Editor editor = sP.edit();
                    editor.remove(mEntries[info]);
                    editor.commit();

                    // REMOVE ITEM CODE NEEDED HERE

                }
            }
        });
        return convertView;
    }
}

希望这能让我更容易理解我需要的东西。

2 个答案:

答案 0 :(得分:1)

这就是我所做的,没有必要初始化'adapter'变量。 getView()内部只需执行此操作:

  1. 从用作数据源的列表中删除项目。
  2. 因此。如果你想从列表中删除第2项

    String mEntries[] = ITEM1, ITEM2, ITEM3, etc

    这样做:

    String newList[] = new String[mEntries.length - 1]; 
    int count = 0;
    for (int i = 0; i < mEntries.length; i++) {
        if (mEntries.length - 1 > 0) {
            if (mEntries[i] == mEntries[1]) { // mEntries[1] as the range starts from 0, so 1 would be ITEM2
                // SKIP IF MATCHES THE ITEM YO WANT TO REMOVE                       
            } else {
                newList[count] = mEntries[i];
                count++;
            }
        }
    }
    mEntries = newList; // save the new list into mEntries
    notifyDataSetChanged(); // notify the changes and the listview/gridview will update
    

答案 1 :(得分:0)

你要求的是非常可能的。你没有提供足够的代码来清楚地知道发生了什么,但你发布的上面的代码将无法工作,除非删除按钮是getView在适配器中返回的整个视图。

适配器中的getView需要看起来像这样:

public View getView(final int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.grid_view_item, null);
        }

        Button removeButton = (Button) convertView.findViewById(R.id.remove_button);
        removeButton.setOnClickListener( new OnClickListener() {
            @Override
            public void onClick(View v) {
                adapter.mThumbIdsList.remove(position);
                adapter.notifyDataSetChanged();
            }
        });

        return convertView;
    }

希望这会有所帮助。祝你好运!