[[144456]] RecycleView is a new control. It standardizes the writing of Viewholder. But I always feel that the writing of the adapter is too lengthy. What should I do? Let's simplify it. The implementation of ViewHolder is the same as ViewHolder in the super-saving writing of ListView adapter ViewHolder.class - public class ViewHolder {
- private SparseArray<View> viewHolder;
- private View view;
-
- public static ViewHolder getViewHolder(View view){
- ViewHolder viewHolder = (ViewHolder) view.getTag();
- if (viewHolder == null ) {
- viewHolder = new ViewHolder(view);
- view.setTag(viewHolder);
- }
- return viewHolder;
- }
- private ViewHolder(View view) {
- this .view = view;
- viewHolder = new SparseArray<View>();
- view.setTag(viewHolder);
- }
- public <T extends View> T get( int id) {
- View childView = viewHolder.get(id);
- if (childView == null ) {
- childView = view.findViewById(id);
- viewHolder.put(id, childView);
- }
- return (T) childView;
- }
-
- public View getConvertView() {
- return view;
- }
-
- public TextView getTextView( int id) {
-
- return get(id);
- }
- public Button getButton( int id) {
-
- return get(id);
- }
-
- public ImageView getImageView( int id) {
- return get(id);
- }
-
- public void setTextView( int id,CharSequence charSequence){
- getTextView(id).setText(charSequence);
- }
-
- }
We inherit RecyclerView.Adapter<RVHolder> AutoRVAdapter.class - public abstract class AutoRVAdapter extends RecyclerView.Adapter<RVHolder> {
-
-
- public List<?> list;
-
- private Context context;
-
- public AutoRVAdapter(Context context, List<?> list) {
- this .list = list;
- this .context = context;
- }
-
- @Override
- public RVHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- View view = LayoutInflater.from(context).inflate(onCreateViewLayoutID(viewType), null );
-
- return new RVHolder(view);
- }
-
- public abstract int onCreateViewLayoutID( int viewType);
-
-
- @Override
- public void onViewRecycled( final RVHolder holder) {
- super .onViewRecycled(holder);
- }
-
- @Override
- public void onBindViewHolder( final RVHolder holder, final int position) {
-
- onBindViewHolder(holder.getViewHolder(), position);
- if (onItemClickListener != null ) {
- holder.itemView.setOnClickListener( new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- onItemClickListener.onItemClick( null , v, holder.getPosition(), holder.getItemId());
- }
- });
- }
-
- }
-
- public abstract void onBindViewHolder(ViewHolder holder, int position);
-
- @Override
- public int getItemCount() {
- return list.size();
- }
-
- private AdapterView.OnItemClickListener onItemClickListener;
-
- public AdapterView.OnItemClickListener getOnItemClickListener() {
- return onItemClickListener;
- }
-
- public void setOnItemClickListener(AdapterView.OnItemClickListener onItemClickListener) {
- this .onItemClickListener = onItemClickListener;
- }
- }
RVHolder.class inherits RecyclerView.ViewHolder - public class RVHolder extends RecyclerView.ViewHolder {
-
-
- private ViewHolder viewHolder;
-
- public RVHolder(View itemView) {
- super (itemView);
- viewHolder=ViewHolder.getViewHolder(itemView);
- }
-
-
- public ViewHolder getViewHolder() {
- return viewHolder;
- }
-
- }
That's it, it's over Our newly written adapter inherits AutoRVAdapter and implements onCreateViewLayoutID and onBindViewHolder methods. onCreateViewLayoutID->Returns the layout of the item. onBindViewHolder->Bind data source. - public class DemoRVAdapter extends AutoRVAdapter {
- public RecyclerAdapter(Context context, List<?> list) {
- super (context, list);
- }
-
- @Override
- public int onCreateViewLayoutID( int viewType) {
- return R.layout.item;
- }
-
- @Override
- public void onBindViewHolder(ViewHolder holder, int position) {
-
- Entity item=(Entity) list.get(position);
- vh.getTextView(R.id.name).setText(item.getName());
- vh.getTextView(R.id.age).setText(item.getAge());
- vh.setText(R.id.height,item.getHeight());
- }
- }
|