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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bluky_di/article/details/53483854

首先,在为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();
            }
        });

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

没有更多推荐了,返回首页