Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-从getView()内部删除GridView项?_Android_Gridview - Fatal编程技术网

Android-从getView()内部删除GridView项?

Android-从getView()内部删除GridView项?,android,gridview,Android,Gridview,我需要一种从GridView中删除项的方法,但这必须在自定义适配器内的getView()方法中完成。以下是我的GridView: 活动: ... String[] newList; newList[0] = "Item 1"; newList[1] = "Item 2"; newList[2] = "Item 3"; ... GridView GV = (GridView) getActivity().findViewById(R.id.g

我需要一种从GridView中删除项的方法,但这必须在自定义适配器内的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;
    }
}
公共类适配器扩展了BaseAdapter{
私有上下文;
私人公寓;
私有字符串元素[];
公共静态类视图持有者{
公共文本视图myTextView;
}
公共适配器(上下文,字符串[]项){
mContext=上下文;
mInflator=(LayoutInflater)mContext.getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
mEntries=条目;
}
@凌驾
public int getCount(){
返回长度;
}
@凌驾
公共对象getItem(int位置){
返回位置;
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
ViewHolder=null;
if(convertView==null){
convertView=mInflator.inflate(R.layout.gvitemlayout,父项,false);
holder=新的ViewHolder();
holder.myTextView=(TextView)convertView.findViewById(R.list.removeItem);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
字符串=元素[位置];
String[]data=String.split(“\\”);
如果(数据长度<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(“无项目”);
}否则{
TextView itemName=(TextView)convertView.findViewById(R.list.itemName);
itemName.setText(数据[1]);
TextView itemClass=(TextView)convertView.findViewById(R.list.itemClass);
itemClass.setText(数据[0]);
}
最终整数信息=(整数)getItem(位置);
holder.myTextView.setOnClickListener(新的OnClickListener(){
公共void onClick(视图v){
SharedReferences sP=mContext.getSharedReferences(“fav”,mContext.MODE\u PRIVATE);
布尔b=sP.getBoolean(mEntries[info],false);
如果(b==true){
SharedReferences.Editor=sP.edit();
删除(mEntries[info]);
commit();
//删除此处所需的项目代码
}
}
});
返回视图;
}
}

希望这能让我更容易理解我需要什么。

你的要求是很可能的。您没有提供足够的代码来明确到底发生了什么,但是您上面发布的代码将无法工作,除非删除按钮是适配器中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;
    }

希望这有帮助。祝你好运

我就是这么做的,不需要初始化“adapter”变量。在
getView()中,只需执行以下操作:

  • 从用作数据源的列表中删除该项
  • 所以。如果要从列表中删除项目2

    String mEntries[]=ITEM1、ITEM2、ITEM3等

    这样做:

    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
    
    String newList[]=新字符串[mEntries.length-1];
    整数计数=0;
    for(int i=0;i0){
    如果(mEntries[i]==mEntries[1]){//mEntries[1]作为范围从0开始,那么1将是ITEM2
    //如果与要删除的项目匹配,则跳过
    }否则{
    newList[count]=mEntries[i];
    计数++;
    }
    }
    }
    mEntries=newList;//将新列表保存到mEntries中
    notifyDataSetChanged();//通知更改,listview/gridview将更新
    
    我粘贴的代码不是我的代码,我在StackOverflow上找到了它。我需要知道的是onClick里面是什么。如何使用
    int position
    删除项目?我有
    GridView gv=(GridView)convertView.findviewbyd(R.id.grid)在我的onClick中,下一步是什么?您不会从GridView中删除子视图。您可以从适配器的数据集中删除该项,并在适配器上调用
    notifyDataSetChanged()
    。在没有看到任何代码的情况下,这大概是我们能给您的最好解释了。@Extremis我的答案正确地回答了这个问题。在向GridView提供视图的适配器的getView方法中,当按下“移除视图”按钮时,这就是您希望最终移除的位置。请注意,在方法的签名中,我将位置声明为final,然后在单击侦听器中,我使用该位置删除需要删除的数据,并重新绘制网格。这就是您如何做到的,但是很明显,您必须根据自己的用途调整此代码。我假设支持适配器的数据实际上是Adapter.mThumIdsList。这就是我需要帮助的地方。如何初始化“适配器”变量?另外,我在上面的主要帖子中发布了一篇编辑文章。请查看我当前的代码。@这可能远远超出了此问题的范围。当我说初始化时,我的意思是调用新的MyAdapter();或者随便你怎么称呼你的适配器。你可以看看这个问题,看看有人使用BaseAdapter(我的go-to适配器)为ListView创建视图的例子,就适配器而言,它是相同的。回答得很好,先生。但有时它会显示arrayindexoutofboundexception