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是唯一的,可以根据此进行唯一的标识