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+红黑树+数据结构

image.png

5G的到来证明了互联网行业发展一如既往的快,作为一名开发人员(Java岗)梦想自然是互联网行业的大厂,这次有幸获得面试字节跳动的机会,为此我也做出了准备在面试前一个月就开始做准备了,也很荣幸的拿到了字节跳动的offer,这里分享一份字节跳动三面过程!

字节一面

  1. hashmap,怎么扩容,怎么处理数据冲突?怎么高效率的实现数据迁移?
  2. Linux的共享内存如何实现,大概说了一下。
  3. socket网络编程,说一下TCP的三次握手和四次挥手
  4. 同步IO和异步IO的区别?
  5. Java GC机制?GC Roots有哪些?
  6. 红黑树讲一下,五个特性,插入删除操作,时间复杂度?
  7. 快排的时间复杂度,最坏情况呢,最好情况呢,堆排序的时间复杂度呢,建堆的复杂度是多少

字节二面

  1. 自我介绍,主要讲讲做了什么和擅长什么
  2. 设计模式了解哪些?
  3. AtomicInteger怎么实现原子修改的?
  4. ConcurrentHashMap 在Java7和Java8中的区别?为什么Java8并发效率更好?什么情况下用HashMap,什么情况用ConcurrentHashMap?
  5. redis数据结构?
  6. redis数据淘汰机制?

字节三面

  1. mysql实现事务的原理(MVCC)
  2. MySQL数据主从同步是如何实现的?
  3. MySQL索引的实现,innodb的索引,b+树索引是怎么实现的,为什么用b+树做索引节点,一个节点存了多少数据,怎么规定大小,与磁盘页对应。
  4. 如果Redis有1亿个key,使用keys命令是否会影响线上服务?
  5. Redis的持久化方式,aod和rdb,具体怎么实现,追加日志和备份文件,底层实现原理的话知道么?
  6. 遇到最大困难是什么?怎么克服?
  7. 未来的规划是什么?
  8. 你想问我什么?

以上就字节跳动后端研发面试题,以下该面试题的部分参考答案。

字节跳动三面拿offer:网络+IO+redis+JVM+GC+红黑树+数据结构

金三银四跳槽季,小弟为各位大哥准备了几份面试宝典:

  • 一份是技术干货《Java核心知识点整理》
  • 一份是面试真题《1000道互联网Java工程师面试题》
  • 面试宝典《互联网Java工程师面试题大全》
  • 点赞+关注,点这里直达即可获得免费领取方式。

Java核心知识点整理

字节跳动三面拿offer:网络+IO+redis+JVM+GC+红黑树+数据结构

1000道互联网Java工程师面试题

image.png

互联网大厂面试宝典

image.png

面试题答案,获取方式

关注+点这里直达即可获取~

重要的话说三遍,先点赞+评论,然后点这里直达才可拿到参考答案哦!

以上是关于android 怎么在外面拿recyclerview 中viewholder的控件的主要内容,如果未能解决你的问题,请参考以下文章

字节跳动三面拿offer:网络+IO+redis+JVM+GC+红黑树+数据结构

如何确定 Android 库的正确版本?

Android-Recyclerview-使用分割线

Android RecyclerView嵌套RecyclerView

在外部蓝牙设备和 Android 手机之间传输音频

Android Oreo (API 26) - 在外部存储中创建目录