给ListView注册上下文菜单,长按某项item并根据弹出菜单删除该item

来源:互联网 发布:淘宝的康恩贝那么便宜 编辑:程序博客网 时间:2024/05/22 12:03

首先,在为ListView添加数据,设置适配器。

其次,为listview注册上下文菜单。

最后,在重写的上下文菜单的onCreateContextMenu方法中去获取当长按ListView的时候对应item的positon

在onContextItemSelected()方法中去移除数据,刷新listview。

大概就是这样,下面给出代码。

一、布局文件 main_layout

<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical" android:layout_width="match_parent"    android:layout_height="match_parent">    <ListView        android:id="@+id/my_listview"        android:layout_width="match_parent"        android:layout_height="match_parent">    </ListView></FrameLayout>

二、MainActivity

public class MainActivity extends Activity {    private ListView mListView;    private List<String>mData;    private MyListAdapter mAdapter;    private int item_id;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.first_layout);        init();    }    public void init(){        mListView = (ListView)findViewById(R.id.my_listview);        mData = new ArrayList<>();        for (int i = 0; i <10 ; i++) {            mData.add("item"+i);        }        mAdapter = new MyListAdapter(MainActivity.this,mData);        mListView.setAdapter(mAdapter);        registerForContextMenu(mListView);    }    @Override    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {        //获取对应的item的positon        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;        item_id = info.position;        //设置菜单布局        MenuInflater inflater = new MenuInflater(FirstActivity.this);        inflater.inflate(R.menu.menu,menu);    }    @Override    public boolean onContextItemSelected(MenuItem item) {        switch (item.getItemId()){            case R.id.menu_f:                mData.remove(item_id);                mAdapter.notifyDataSetChanged();                break;        }        return true;    }}


三、关于适配器就是继承了BaseAdapter,重写几个方法,meun的布局文件就只包含一个item。
public class MyListAdapter extends BaseAdapter {    private List<String>mData;    private Context mContext;    public MyListAdapter(Context mContext,List<String>mData) {        this.mContext = mContext;        this.mData = mData;    }    @Override    public int getCount() {        return mData.size();    }    @Override    public Object getItem(int position) {        return 0;    }    @Override    public long getItemId(int position) {        return 0;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        View view ;        MyViewHorlder myViewHorlder;        if (convertView==null) {            view = LayoutInflater.from(mContext).inflate(R.layout.list_item_layout,null);            myViewHorlder = new MyViewHorlder();            myViewHorlder.textView = (TextView)view.findViewById(R.id.list_item_text);            view.setTag(myViewHorlder);        }else {            view = convertView;            myViewHorlder = (MyViewHorlder) view.getTag();        }        myViewHorlder.textView.setText(mData.get(position));        return view;    }    class MyViewHorlder{        TextView textView;    }}
<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android">    <item android:id="@+id/menu_f" android:title="删除item"></item></menu>

其实这里最想记录的是,在这种情况下,如何获取到对应item的position。
在开始的时候想要用ListView的setOnItemLongClickListener这个方法去获取对应的positon,然后赋值给自己定义的全局变量。后来发现,onContextItemSelected方法却不会执行了。


还有一个类似的问题也记录下来:
在listview的item上要是有个控件,比如说button。想要点击这个按钮,删除item的话,那么当点击的时候想要拿到对应的item的positon的话,可以在适配器里面写一个接口回调,将positon作为参数给传递出去。
在适配器的getView方法中

myViewHorlder.deleteBtn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                onDeleteItem.onItemclick(position);            }        });

回调接口

 //定义监听接口    private onItemDeleteListener onDeleteItem;        public interface onItemDeleteListener{        void onItemclick(int mPositon);    }        public void setOnDeleteItem(onItemDeleteListener onDeleteItem){        this.onDeleteItem = onDeleteItem;    }

最后在MainActivity中

  mAdapter.setOnDeleteItem(new MyListAdapter.onItemDeleteListener() {            @Override            public void onItemclick(int positon) {                mData.remove(positon);                mAdapter.notifyDataSetChanged();            }        });

第一次写博客记录东西,新手有很多不足之处,希望各位大神能指点指点。

0 0
原创粉丝点击