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 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 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 {

private Context context;

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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐