android 怎么在外面拿recyclerview 中viewholder的控件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 怎么在外面拿recyclerview 中viewholder的控件相关的知识,希望对你有一定的参考价值。
参考技术A 项目中使用到了横向的ListView样子的功能,一开始使用Gallery做,由于Gallery的自带弹性功能,效果不理想,于是使用网上的一些开源的横向ListView,但是效果很卡,最后使用了v7包中的RecyclerView,初次使用,不太熟练,对其进行了简单的封装
package cn.zmit.sujiamart.adapter.base;
import java.util.ArrayList;
import java.util.List;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import cn.zmit.sujiamart.holder.base.RecyclerViewHolderBase;
/**
* 横向RecyclerView基类adapter
* @author Robin
* time 2015-04-10 12:33:43
*
* @param <ItemDataType> 数据实体类型
*/
public abstract class HorizontalRecyclerViewBaseAdapter<ItemDataType> extends
RecyclerView.Adapter<RecyclerViewHolderBase>
protected ArrayList<ItemDataType> mItemDataList = new ArrayList<ItemDataType>();
public HorizontalRecyclerViewBaseAdapter()
/**
* 动态增加一条数据
* @param itemDataType 数据实体类对象
*/
public void append(ItemDataType itemDataType)
if (itemDataType!=null)
mItemDataList.add(itemDataType);
notifyDataSetChanged();
/**
* 动态增加一组数据集合
* @param itemDataTypes 数据实体类集合
*/
public void append(List<ItemDataType> itemDataTypes)
if (itemDataTypes.size()>0)
for (ItemDataType itemDataType : itemDataTypes)
mItemDataList.add(itemDataType);
notifyDataSetChanged();
/**
* 替换全部数据
* @param itemDataTypes 数据实体类集合
*/
public void replace(List<ItemDataType> itemDataTypes)
mItemDataList.clear();
if (itemDataTypes.size()>0)
mItemDataList.addAll(itemDataTypes);
notifyDataSetChanged();
/**
* 移除一条数据集合
* @param position
*/
public void remove(int position)
mItemDataList.remove(position);
notifyDataSetChanged();
/**
* 移除所有数据
*/
public void removeAll()
mItemDataList.clear();
notifyDataSetChanged();
@Override
public int getItemCount()
return mItemDataList.size();
@Override
public void onBindViewHolder(RecyclerViewHolderBase viewHolder, int i)
showData(viewHolder, i, mItemDataList);
@Override
public RecyclerViewHolderBase onCreateViewHolder(ViewGroup viewGroup, int i)
View view=createView(viewGroup, i);
RecyclerViewHolderBase holder = createViewHolder(view);
return holder;
/*public static class ViewHolder extends RecyclerView.ViewHolder
private ImageView img_product;
private TextView tv_title;
public ViewHolder(View itemView)
super(itemView);
img_product=(ImageView) itemView.findViewById(R.id.img_product);
tv_title=(TextView) itemView.findViewById(R.id.tv_title);
*/
/**
* 显示数据抽象函数
* @param viewHolder 基类ViewHolder,需要向下转型为对应的ViewHolder(example:MainRecyclerViewHolder mainRecyclerViewHolder=(MainRecyclerViewHolder) viewHolder;)
* @param i 位置
* @param mItemDataList 数据集合
*/
public abstract void showData(RecyclerViewHolderBase viewHolder, int i,List<ItemDataType> mItemDataList );
/**
* 加载item的view,直接返回加载的view即可
* @param viewGroup 如果需要Context,可以viewGroup.getContext()获取
* @param i
* @return item 的 view
*/
public abstract View createView(ViewGroup viewGroup, int i) ;
/**
* 加载一个ViewHolder,为RecyclerViewHolderBase子类,直接返回子类的对象即可
* @param view item 的view
* @return RecyclerViewHolderBase 基类ViewHolder
*/
public abstract RecyclerViewHolderBase createViewHolder(View view) ;
上面是基类,如果需要多个不同的横向RecyclerView,可以继承上面的基类
下面是一个Example:
package cn.zmit.sujiamart.adapter;
import java.util.List;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import cn.zmit.sujiamart.R;
import cn.zmit.sujiamart.adapter.base.HorizontalRecyclerViewBaseAdapter;
import cn.zmit.sujiamart.constants.Url;
import cn.zmit.sujiamart.entity.ProductsEntity;
import cn.zmit.sujiamart.holder.MainHorizontalRecyclerViewHolder;
import cn.zmit.sujiamart.holder.base.RecyclerViewHolderBase;
import cn.zmit.sujiamart.image.ImageDisplayer;
import cn.zmit.sujiamart.ui.activity.ProductDetailsActivity;
/**
* 主页横向RecyclerView的适配器
* @author Robin
* time 2015-04-10 12:50:31
*
*/
public class MainHorizontalRecyclerViewAdapter extends
HorizontalRecyclerViewBaseAdapter<ProductsEntity>
private Context context;
public MainHorizontalRecyclerViewAdapter()
@Override
public void showData(RecyclerViewHolderBase viewHolder, final int i,
final List<ProductsEntity> mItemDataList)
//向下转型为子类
MainHorizontalRecyclerViewHolder mainRecyclerViewHolder=(MainHorizontalRecyclerViewHolder) viewHolder;
//为控件赋值
ImageDisplayer.getInstance().dispalyImageWithRadius(Url.IMAGE_URL_ROOT+mItemDataList.get(i).getImage(), mainRecyclerViewHolder.img_product);
mainRecyclerViewHolder.tv_title.setText(mItemDataList.get(i).getName());
mainRecyclerViewHolder.tv_price.setText(mItemDataList.get(i).getPrice());
mainRecyclerViewHolder.tv_old_price.setText("¥"+mItemDataList.get(i).getPrice_special());
mainRecyclerViewHolder.mRootRelativeLayout.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Intent intent=new Intent(context, ProductDetailsActivity.class);
Bundle bundle=new Bundle();
bundle.putString("productId", mItemDataList.get(i).getProduct_id());
intent.putExtras(bundle);
context.startActivity(intent);
);
@Override
public View createView(ViewGroup viewGroup, int i)
context=viewGroup.getContext();
//加载item的布局
View view=View.inflate(context,R.layout.item_main_horizontal_listview, null);
return view;
@Override
public RecyclerViewHolderBase createViewHolder(View view)
//直接返回viewholder对象
return new MainHorizontalRecyclerViewHolder(view);
RycycleView需要一个ViewHolder,这里也对ViewHolder进行了简单封装,下面是ViewHolder的基类
package cn.zmit.sujiamart.holder.base;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.view.View;
/**
* RecyclerViewHolder基类
* @author Robin
*time 2015-04-10 11:43:49
*/
public abstract class RecyclerViewHolderBase extends ViewHolder
public RecyclerViewHolderBase(View itemView)
super(itemView);
如上Adapter需要对应一个ViewHolder,只需要继承上面的Viewholder基类,即可。
package cn.zmit.sujiamart.holder;
import android.graphics.Paint;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import cn.zmit.sujiamart.R;
import cn.zmit.sujiamart.holder.base.RecyclerViewHolderBase;
/**
* 主页横向RecyclerView的viewholder
* @author Robin
* time 2015-04-10 12:53:02
*
*/
public class MainHorizontalRecyclerViewHolder extends RecyclerViewHolderBase
public ImageView img_product;
public TextView tv_title;
public TextView tv_price;
public TextView tv_old_price;
public RelativeLayout mRootRelativeLayout;
/**
* 在构造函数中进行findviewbyid
* @param itemView item的view
*/
public MainHorizontalRecyclerViewHolder(View itemView)
super(itemView);
img_product=(ImageView) itemView.findViewById(R.id.img_product);
tv_title=(TextView) itemView.findViewById(R.id.tv_title);
tv_price=(TextView) itemView.findViewById(R.id.tv_price);
tv_old_price=(TextView) itemView.findViewById(R.id.tv_old_price);
tv_old_price.getPaint().setFlags(Paint. STRIKE_THRU_TEXT_FLAG|Paint.ANTI_ALIAS_FLAG); //设置中划线加清晰
mRootRelativeLayout=(RelativeLayout) itemView.findViewById(R.id.rl_root);
本回答被提问者采纳
字节跳动三面拿offer:网络+IO+redis+JVM+GC+红黑树+数据结构
5G的到来证明了互联网行业发展一如既往的快,作为一名开发人员(Java岗)梦想自然是互联网行业的大厂,这次有幸获得面试字节跳动的机会,为此我也做出了准备在面试前一个月就开始做准备了,也很荣幸的拿到了字节跳动的offer,这里分享一份字节跳动三面过程!
字节一面:
- hashmap,怎么扩容,怎么处理数据冲突?怎么高效率的实现数据迁移?
- Linux的共享内存如何实现,大概说了一下。
- socket网络编程,说一下TCP的三次握手和四次挥手
- 同步IO和异步IO的区别?
- Java GC机制?GC Roots有哪些?
- 红黑树讲一下,五个特性,插入删除操作,时间复杂度?
- 快排的时间复杂度,最坏情况呢,最好情况呢,堆排序的时间复杂度呢,建堆的复杂度是多少
字节二面
- 自我介绍,主要讲讲做了什么和擅长什么
- 设计模式了解哪些?
- AtomicInteger怎么实现原子修改的?
- ConcurrentHashMap 在Java7和Java8中的区别?为什么Java8并发效率更好?什么情况下用HashMap,什么情况用ConcurrentHashMap?
- redis数据结构?
- redis数据淘汰机制?
字节三面
- mysql实现事务的原理(MVCC)
- MySQL数据主从同步是如何实现的?
- MySQL索引的实现,innodb的索引,b+树索引是怎么实现的,为什么用b+树做索引节点,一个节点存了多少数据,怎么规定大小,与磁盘页对应。
- 如果Redis有1亿个key,使用keys命令是否会影响线上服务?
- Redis的持久化方式,aod和rdb,具体怎么实现,追加日志和备份文件,底层实现原理的话知道么?
- 遇到最大困难是什么?怎么克服?
- 未来的规划是什么?
- 你想问我什么?
以上就字节跳动后端研发面试题,以下该面试题的部分参考答案。
金三银四跳槽季,小弟为各位大哥准备了几份面试宝典:
- 一份是技术干货《Java核心知识点整理》
- 一份是面试真题《1000道互联网Java工程师面试题》
- 面试宝典《互联网Java工程师面试题大全》
- 点赞+关注,点这里直达即可获得免费领取方式。
Java核心知识点整理
1000道互联网Java工程师面试题
互联网大厂面试宝典
面试题答案,获取方式
关注+点这里直达即可获取~
重要的话说三遍,先点赞+评论,然后点这里直达才可拿到参考答案哦!
以上是关于android 怎么在外面拿recyclerview 中viewholder的控件的主要内容,如果未能解决你的问题,请参考以下文章
字节跳动三面拿offer:网络+IO+redis+JVM+GC+红黑树+数据结构