您的位置:首页 > 移动开发 > Android开发

Android RecyclerView实现横向滚动

2017-08-15 13:44 666 查看
我相信很久以前,大家在谈横向图片轮播是时候,优先会选择具有HorizontalScrollView效果和ViewPager来做,不过自从Google大会之后,系统为我们提供了另一个控件RecyclerView。RecyclerView是listview之后的又一利器,它可以实现高度的定制。今天就利用RecyclerView实现我们需要的相册效果。

先上一个图:



主要实现就是一个RecyclerView+RecyclerView.Adapter实现。

Activity的布局文件:

<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:scrollbars="none" />


我这里是自定义的控件,主要代码:

public class SimpleLinearLayout extends LinearLayout {

protected Context mContext;
protected View contentView;
protected AtomicBoolean isPreparingData;

public SimpleLinearLayout(Context context) {
super(context);
this.mContext = context;
isPreparingData = new AtomicBoolean(false);
initViews();
}

public SimpleLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = context;
isPreparingData = new AtomicBoolean(false);
initViews();
}
protected void initViews() {

}
}


主页面代码:

public class SpeedHourView extends SimpleLinearLayout {

@BindView(R.id.recycler_view)
RecyclerView recyclerView;

private SpeedHourAdapter speedHourAdapter=null;
private SpeedHourEntity entity=null;

public SpeedHourView(Context context) {
this(context, null);
}

public SpeedHourView(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
protected void initViews() {
contentView = inflate(mContext, R.layout.layout_speed_per_hour, this);
ButterKnife.bind(this);
init();
}

private void init() {
initData();
initView();
initAdapter();
}

private void initData() {
String data = FileUtils.readAssert(mContext, "speenhour.txt");
entity = JsonUtils.parseJson(data, SpeedHourEntity.class);
}

private void initView() {
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext);
linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
recyclerView.setLayoutManager(linearLayoutManager);

}

private void initAdapter() {
speedHourAdapter=new SpeedHourAdapter(mContext);
recyclerView.setAdapter(speedHourAdapter);
if (entity!=null&&entity.topic!=null&&entity.topic.items!=null&&entity.topic.items.size()>0){
List<SpeedHourEntity.TopicBean.ItemsBean.ListBean> listBeen=entity.topic.items.get(0).list;
if (listBeen!=null&&listBeen.size()>0)
speedHourAdapter.setList(listBeen);
}

speedHourAdapter.setOnItemClickListener(new SpeedHourAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
ProductDetailsActivity.open(mContext);
}
});
}

@OnClick(R.id.more_view)
public void moreClick() {
ToastUtils.showToast("更多时速达");
}
}


adapter布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ptr="http://schemas.android.com/apk/res-auto"
android:id="@+id/speed_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp"
android:gravity="center">

<ImageView
android:id="@+id/speed_image"
android:layout_width="85dp"
android:layout_height="85dp"
android:scaleType="fitXY"
/>

<TextView
android:id="@+id/speed_name"
style="@style/style_c6_s14"
android:layout_marginTop="5dp"
android:text="蜂蜜柚子茶"
android:maxLines="1"/>

<TextView
android:id="@+id/speed_price"
style="@style/style_c8_s14"
android:layout_marginTop="5dp"
android:text="¥30.0"
android:maxLength="6"
android:maxLines="1"/>
</LinearLayout>


adapter代码:

public class SpeedHourAdapter extends RecyclerView.Adapter<SpeedHourHolder> {

private List<ListBean> specailList;
private LayoutInflater mInflater;
private Context mContext=null;

public SpeedHourAdapter(Context context) {
this.mContext=context;
mInflater = LayoutInflater.from(context);
}

public void setList(List<ListBean> list) {
this.specailList = list;
notifyDataSetChanged();
}

public OnItemClickListener mOnItemClickListener;

public interface OnItemClickListener {
void onItemClick(View view, int position);
}

public void setOnItemClickListener(OnItemClickListener mOnItemClickLitener) {
this.mOnItemClickListener = mOnItemClickLitener;
}

@Override
public SpeedHourHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mInflater.inflate(R.layout.item_speedhour_layout, parent, false);

SpeedHourHolder holder = new SpeedHourHolder(view);
return holder;
}

@Override
public void onBindViewHolder(final SpeedHourHolder holder, final int position) {
ListBean bean = specailList.get(position);
if (bean != null) {
holder.speedImage.setScaleType(ImageView.ScaleType.FIT_XY);
Glide.with(mContext).load(bean.pic).error(R.drawable.welfare_default_icon).into(holder.speedImage);
holder.speedName.setText("同仁堂枸杞茶");
holder.speedPrice.setText("¥"+Math.random()*100);
}

holder.speedView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mOnItemClickListener!=null){
mOnItemClickListener.onItemClick(holder.speedView,position);
}
}
});
}

@Override
public int getItemCount() {
return specailList.size();
}
}

class SpeedHourHolder extends RecyclerView.ViewHolder {

@BindView(R.id.speed_view)
LinearLayout speedView;
@BindView(R.id.speed_image)
ImageView speedImage;
@BindView(R.id.speed_name)
TextView speedName;
@BindView(R.id.speed_price)
TextView speedPrice;

public SpeedHourHolder(View itemView) {
super(itemView);
ButterKnife.bind(this,itemView);
itemView.setTag(this);
}


代码中用到的实体类:

public class SpeedHourEntity {

public TopicBean topic;

public static class TopicBean {
public long nextupdatetime;
public List<ItemsBean> items;

public static class ItemsBean {
public int id;
public String theme;
public int products;
public int users;
public String href;
public boolean follow;
public int topictype;

public List<ListBean> list;

public static class ListBean {
public String id;
public int price;
public String pic;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: