先上效果图:
之前是使用
自定义HorizontalScrollView嵌套HorizontalListView实现手势监听、按钮监听滑动功能实现的以上功能
想了解的小伙伴们可以看我之前的文章:http://blog.youkuaiyun.com/lxlyhm/article/details/52245403。
新项目又需要实现类似的功能,所以换了更好更简洁的recycleview来实现此功能,在此记录一下。首先还是main.xml布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/color_f5" >
<LinearLayout
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:background="@color/color_fff"
android:gravity="center_vertical" >
<RelativeLayout
android:id="@+id/rl_news_back"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center" >
<ImageView
android:id="@+id/img_news_back_pre"
android:layout_width="30dp"
android:layout_height="wrap_content"
android:src="@drawable/left_gray" />
</RelativeLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="75dp"
android:layout_weight="0.50"
android:scrollbars="vertical" />
<RelativeLayout
android:id="@+id/rl_news_enter"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center" >
<ImageView
android:id="@+id/img_news_enter"
android:layout_width="30dp"
android:layout_height="wrap_content"
android:src="@drawable/goenter" />
</RelativeLayout>
</LinearLayout>
</RelativeLayout>
item.xml布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp">
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/tv_titlt"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:text="这是一行字"
android:gravity="center"
android:layout_below="@+id/imageView1"
android:layout_centerHorizontal="true"
android:textColor="@color/color_333"
android:textSize="15sp"/>
</RelativeLayout>
mainActivity.java
public class MainActivity extends AppCompatActivity implements OnClickListener,RecyclerAdapter.OnItemClickListener {
private RecyclerView mRecyclerView;
private RecyclerAdapter mAdapter;
private LinearLayoutManager mLinearLayoutManager;
private int n = 0;
private ImageView back;
private ImageView enter;
List<String> list = new ArrayList<String>();
private RelativeLayout rl_news_enter;
private RelativeLayout rl_news_back;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
}
private void initData() {
for (int i = 0; i < 25; i++) {
list.add("item");
}
}
@SuppressWarnings("deprecation")
private void initView() {
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
rl_news_back = (RelativeLayout) findViewById(R.id.rl_news_back);
rl_news_enter = (RelativeLayout) findViewById(R.id.rl_news_enter);
rl_news_back.setOnClickListener(this);
rl_news_enter.setOnClickListener(this);
back = (ImageView) findViewById(R.id.img_news_back_pre);
enter = (ImageView) findViewById(R.id.img_news_enter);
enter.setImageResource(R.drawable.goenter);
mLinearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
mAdapter = new RecyclerAdapter(list);
mRecyclerView.setLayoutManager(mLinearLayoutManager);
mRecyclerView.setAdapter(mAdapter);
mAdapter.addOnItemClickListener(this);
mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
//用来标记是否正在向最后一个滑动
boolean isSlidingToLast = false;
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
int firstVisible = mLinearLayoutManager.findFirstVisibleItemPosition();
int lastVisible = mLinearLayoutManager.findLastVisibleItemPosition();
if (firstVisible <= 0) {
back.setImageResource(R.drawable.left_gray);
enter.setImageResource(R.drawable.goenter);
} else if (lastVisible >= mAdapter.getItemCount()-1) {
back.setImageResource(R.drawable.back);
enter.setImageResource(R.drawable.right_gray);
} else {
back.setImageResource(R.drawable.back);
enter.setImageResource(R.drawable.goenter);
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
//dx用来判断横向滑动方向,dy用来判断纵向滑动方向
if (dx > 0) {
//大于0表示正在向右滚动
isSlidingToLast = true;
} else {
//小于等于0表示停止或向左滚动
isSlidingToLast = false;
}
}
});
}
@Override
public void onItemClick(View view, int position) {
// mAdapter.notifyDataSetChanged();
Toast.makeText(this, "点击了" + position, Toast.LENGTH_SHORT).show();
}
private void move(int n) {
if (n <= 0) {
back.setImageResource(R.drawable.left_gray);
enter.setImageResource(R.drawable.goenter);
} else if (n >= mAdapter.getItemCount() - 1) {
back.setImageResource(R.drawable.back);
enter.setImageResource(R.drawable.right_gray);
} else {
back.setImageResource(R.drawable.back);
enter.setImageResource(R.drawable.goenter);
}
mRecyclerView.stopScroll();
smoothMoveToPosition(n);
}
private void smoothMoveToPosition(int n) {
int firstItem = mLinearLayoutManager.findFirstVisibleItemPosition();
int lastItem = mLinearLayoutManager.findLastVisibleItemPosition();
if (n <= firstItem) {
mRecyclerView.smoothScrollToPosition(n);
} else if (n <= lastItem) {
int top = mRecyclerView.getChildAt(n - firstItem).getLeft();
mRecyclerView.smoothScrollBy(0, top);
} else {
mRecyclerView.smoothScrollToPosition(n);
}
}
@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.rl_news_back:
n = mLinearLayoutManager.findFirstVisibleItemPosition();
if (n > 0) {
n = n - 4;
move(n);
}
break;
case R.id.rl_news_enter:
n = mLinearLayoutManager.findLastVisibleItemPosition();
if (n == mAdapter.getItemCount()) {
move(n);
} else {
n = n + 4;
move(n);
}
break;
default:
break;
}
}
}
recycleview适配器:
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder> {
private OnItemClickListener mOnItemClickListener;
private List<Boolean> isClicks;//控件是否被点击,默认为false,如果被点击,改变值,控件根据值改变自身颜色
private List<String> mDatas;
public RecyclerAdapter(List<String> datas){
this.mDatas = datas;
isClicks = new ArrayList<>();
isClicks.add(0, true);//第一项设置默认点击
for(int i = 1; i < mDatas.size(); i++){
isClicks.add(false);
}
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_main_recycle_item,parent,false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
String string = mDatas.get(position);
holder.title.setText(string + position);
if (isClicks.get(position)) {
holder.title.setTextColor(Color.parseColor("#af0000"));
}else{
holder.title.setTextColor(Color.parseColor("#333333"));
}
// 如果设置了回调,则设置点击事件
if (mOnItemClickListener != null) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for(int i = 0; i <isClicks.size();i++){
isClicks.set(i,false);
}
isClicks.set(position,true);
notifyDataSetChanged();
int n = holder.getLayoutPosition();
mOnItemClickListener.onItemClick(v,n);
}
});
}
}
@Override
public int getItemCount() {
return mDatas.size();
}
class MyViewHolder extends RecyclerView.ViewHolder{
private TextView title;
public MyViewHolder(View itemView) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.tv_titlt);
}
}
public void addOnItemClickListener(OnItemClickListener listener){
mOnItemClickListener = listener;
}
public interface OnItemClickListener{
void onItemClick(View view,int position);
}
}
Demo源码下载:http://download.youkuaiyun.com/detail/lxlyhm/9712813