recyclerview点击item弹出popupwindow

来源:互联网 发布:mac可用的魔兽世界插件 编辑:程序博客网 时间:2024/05/18 01:40

recyclerview+popupwindow:

先看activity:

package com.fanyafeng.orlitedemo.recycleview.activity;import android.os.Bundle;import android.support.design.widget.FloatingActionButton;import android.support.design.widget.Snackbar;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.GridLayoutManager;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.Toolbar;import android.util.Log;import android.view.View;import android.widget.Toast;import com.fanyafeng.orlitedemo.BaseActivity;import com.fanyafeng.orlitedemo.R;import com.fanyafeng.orlitedemo.dao.Album;import com.fanyafeng.orlitedemo.dao.Song;import com.fanyafeng.orlitedemo.recycleview.adapter.MyRecycleViewAdapter;import com.orangegangsters.github.swipyrefreshlayout.library.SwipyRefreshLayout;import com.orangegangsters.github.swipyrefreshlayout.library.SwipyRefreshLayoutDirection;import org.litepal.crud.DataSupport;import java.util.ArrayList;import java.util.List;public class MyRecycleViewActivity extends BaseActivity {    private RecyclerView rv_myrecycleview;    private List<String> stringList = new ArrayList<>();    private MyRecycleViewAdapter myRecycleViewAdapter;    private SwipyRefreshLayout swipyrefreshlayout;    private int count = 0;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_my_recycle_view);        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);        setSupportActionBar(toolbar);        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);        fab.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)                        .setAction("Action", null).show();            }        });        getData();        initView();        initData();    }    private void getData() {        List<Album> albumList = DataSupport.where("name like ?", "album%").find(Album.class);        int remain = albumList.size() % 21;        int myCount = (albumList.size() - remain) / 21;        if (count > myCount) {            Toast.makeText(this, "已经加载完毕", Toast.LENGTH_SHORT).show();            return;        } else {            count += 1;            for (int i = (count - 1) * 21; i < (count == (myCount + 1) ? (count - 1) * 21 + remain : count * 21); i++) {                stringList.add(albumList.get(i).getName());            }        }    }    private void initView() {        swipyrefreshlayout = (SwipyRefreshLayout) findViewById(R.id.swipyrefreshlayout);        rv_myrecycleview = (RecyclerView) findViewById(R.id.rv_myrecycleview);    }    private void initData() {        myRecycleViewAdapter = new MyRecycleViewAdapter(this, stringList);        rv_myrecycleview.setAdapter(myRecycleViewAdapter);//        rv_myrecycleview.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));        rv_myrecycleview.setLayoutManager(new GridLayoutManager(this, 2, GridLayoutManager.VERTICAL, false));        swipyrefreshlayout.setOnRefreshListener(new SwipyRefreshLayout.OnRefreshListener() {            @Override            public void onRefresh(SwipyRefreshLayoutDirection direction) {                if (direction == SwipyRefreshLayoutDirection.TOP) {                    stringList.clear();                    count = 0;                    getData();                    myRecycleViewAdapter.notifyDataSetChanged();                    swipyrefreshlayout.setRefreshing(false);                } else if (direction == SwipyRefreshLayoutDirection.BOTTOM) {                    getData();                    myRecycleViewAdapter.notifyDataSetChanged();                    swipyrefreshlayout.setRefreshing(false);                }            }        });    }}

adapter

package com.fanyafeng.orlitedemo.recycleview.adapter;import android.app.ActionBar;import android.content.Context;import android.graphics.Bitmap;import android.graphics.drawable.BitmapDrawable;import android.support.v7.widget.RecyclerView;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.PopupWindow;import android.widget.TextView;import android.widget.Toast;import com.fanyafeng.orlitedemo.R;import com.fanyafeng.orlitedemo.util.MyUtils;import java.util.List;/** * Created by 365rili on 16/4/18. */public class MyRecycleViewAdapter extends RecyclerView.Adapter<MyRecycleViewAdapter.MyRecycleViewHolder> {    private Context context;    private List<String> itemList;    public OnItemClickListener onItemClickListener;    private PopupWindow popupView;    public interface OnItemClickListener {        void onItemClick(View view, int position);        void onItemLongClick(View view, int position);    }    public MyRecycleViewAdapter(Context context, List<String> itemList) {        this.context = context;        this.itemList = itemList;    }    @Override    public MyRecycleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        View view = LayoutInflater.from(context).inflate(R.layout.item_myrecycler, parent, false);        View popView = LayoutInflater.from(context).inflate(R.layout.layout_popwindow_recyclerview, parent, false);        popupView = new PopupWindow(popView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);        popupView.setTouchable(true);        popupView.setOutsideTouchable(true);        popupView.setBackgroundDrawable(new BitmapDrawable(context.getResources(), (Bitmap) null));        return (new MyRecycleViewHolder(view));    }    @Override    public void onBindViewHolder(final MyRecycleViewHolder holder, final int position) {        if (onItemClickListener != null) {            holder.itemView.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    onItemClickListener.onItemClick(holder.itemView, position);                }            });            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {                @Override                public boolean onLongClick(View v) {                    onItemClickListener.onItemLongClick(holder.itemView, position);                    return true;                }            });        }        holder.tv_myrecycler_item.setText(itemList.get(position));        holder.tv_myrecycler_item.setOnClickListener(new onItemClick(position));    }    @Override    public int getItemCount() {        return itemList.size();    }    static class MyRecycleViewHolder extends RecyclerView.ViewHolder {        private TextView tv_myrecycler_item;        public MyRecycleViewHolder(View itemView) {            super(itemView);            tv_myrecycler_item = (TextView) itemView.findViewById(R.id.tv_myrecycler_item);        }    }    class onItemClick implements View.OnClickListener {        private int position;        public onItemClick(int position) {            this.position = position;        }        @Override        public void onClick(View v) {            Toast.makeText(context, "第" + position + "个被点击了", Toast.LENGTH_SHORT).show();            v.getHeight();            int[] location = new int[2];            v.getLocationInWindow(location);            Log.d("TAG", "点击的item的高度:" + v.getHeight() + "x值:" + location[0] + "y值" + location[1]);            if (MyUtils.getScreenHeight(context) - MyUtils.getNavigationBarHeight(context) - location[1] < MyUtils.dip2px(context, 80)) {//                popupView.showAsDropDown(v, MyUtils.getScreenWidth(context) / 2 - (int) MyUtils.dip2px(context, 40), -v.getHeight() - (int) MyUtils.dip2px(context, 80));                popupView.showAsDropDown(v, MyUtils.getScreenWidth(context) / 4 - (int) MyUtils.dip2px(context, 40), -v.getHeight() - (int) MyUtils.dip2px(context, 80));            } else {//                popupView.showAsDropDown(v, MyUtils.getScreenWidth(context) / 2 - (int) MyUtils.dip2px(context, 40), 0);                popupView.showAsDropDown(v, MyUtils.getScreenWidth(context) / 4 - (int) MyUtils.dip2px(context, 40), 0);            }        }    }    class onItemLongClick implements View.OnLongClickListener {        private int position;        public onItemLongClick(int position) {            this.position = position;        }        @Override        public boolean onLongClick(View v) {            Toast.makeText(context, "第" + position + "个被点击了", Toast.LENGTH_SHORT).show();            return false;        }    }}

这是核心代码,暂时没有测试性能,不过popupwindow设置不可点击,外围不解散的话会跟着item移动,但是,但是因为item复用,所以你知道的,不建议那样搞,当然肯定有办法避免这种情况,因为position是唯一的,可以根据此进行唯一的标识


0 0
原创粉丝点击