New Control of Android 5.x-RecylcerView Implements ListView/GridView

Keywords: Android xml

1. effect picture


2. The steps of implementing ListView vertical list in RecyclerView


RecyclerView is a substitute for ListView and GridView.
RecyclerView has its own recycling rules and no longer needs to manually write code to recycle.

1. library import

Compile'com.android.support: recyclerview-v7:24.2.1'(change to your own version)

2. Adding RecyclerView Control to XML

<android.support.v7.widget.RecyclerView
        android:id="@+id/recylerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </android.support.v7.widget.RecyclerView>

3.Activity code

package com.xzy.testrecylerview001;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.Toast;

import com.xzy.testrecylerview001.adapter.ListAdapter;

public class VerticalListActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_vertical_list);

        mRecyclerView = findViewById(R.id.recylerView);
        initData();
    }

    private void initData() {
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        mRecyclerView.setLayoutManager(layoutManager);
        //test data
        int[] imgRes = new int[100];
        for (int i = 0; i < imgRes.length; i++) {
            imgRes[i] = R.mipmap.ic_launcher;
        }
        ListAdapter listAdapter = new ListAdapter(this, true, imgRes);
        mRecyclerView.setAdapter(listAdapter);

        listAdapter.setOnItemClickListener(new ListAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                Toast.makeText(VerticalListActivity.this, "" + position, Toast.LENGTH_SHORT).show();
            }
        });
    }

    public static void startActivity(Activity activity) {
        Intent intent = new Intent(activity, VerticalListActivity.class);
        activity.startActivity(intent);
    }
}

4.Adapter adapter

package com.xzy.testrecylerview001.adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.xzy.testrecylerview001.R;

/**
 * Function:RecyclerView Adapter
 * Created by xuzhuyun on 2017/11/16.
 */

public class ListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private Context mContext;
    private boolean isVertical;
    private int[] imgResId;
    private OnItemClickListener mOnItemClickListener;


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

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

    public ListAdapter(Context mContext, boolean isVertical, int[] imgResId) {
        this.mContext = mContext;
        this.isVertical = isVertical;
        this.imgResId = imgResId;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(isVertical ? R.layout.item_list_v : R.layout.item_list_h, parent, false);
        return new RecyclerHolder(view);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        ((RecyclerHolder) holder).setData(position);
    }

    public class RecyclerHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        LinearLayout mLinearLayout;
        ImageView mImageView;
        TextView mTextView;

        public RecyclerHolder(View itemView) {
            super(itemView);
            mLinearLayout = itemView.findViewById(R.id.item_layout);
            mImageView = itemView.findViewById(R.id.item_img);
            mTextView = itemView.findViewById(R.id.item_txt);

            mLinearLayout.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if (mOnItemClickListener != null) {
                mOnItemClickListener.onItemClick(getLayoutPosition());
            }
        }

        public void setData(int position) {
            mImageView.setImageResource(imgResId[position]);
            mTextView.setText(isVertical ? "RecyclerView Realization list Vertical list" : "RecyclerView Realization list Horizontal list");
        }
    }

    @Override
    public int getItemCount() {
        return imgResId == null ? 0 : imgResId.length;
    }
}

3.RecyclerView Implementation of ListView Horizontal Listing Steps

Design sketch

The import library file and xml layout are exactly the same as those in 2, which is not to be discussed in detail. Look at Activity code

1.Activity code

package com.xzy.testrecylerview001;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.Toast;

import com.xzy.testrecylerview001.adapter.ListAdapter;

public class HorizontalListActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_horizontal_list);

        mRecyclerView = findViewById(R.id.recylerView);
        initData();
    }

    private void initData() {
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);//Setting level
        mRecyclerView.setLayoutManager(layoutManager);

        //test data
        int[] imgRes = new int[100];
        for (int i = 0; i < imgRes.length; i++) {
            imgRes[i] = R.mipmap.ic_launcher;
        }

        ListAdapter listAdapter = new ListAdapter(this, false, imgRes);
        mRecyclerView.setAdapter(listAdapter);

        listAdapter.setOnItemClickListener(new ListAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                Toast.makeText(HorizontalListActivity.this, "" + position, Toast.LENGTH_SHORT).show();
            }
        });
    }

    public static void startActivity(Activity activity) {
        Intent intent = new Intent(activity, HorizontalListActivity.class);
        activity.startActivity(intent);
    }
}

2.Adapter code

The adapter code is the same as the adapter code in 2. Because an adapter is common here, the isVertical parameter is added to determine whether a vertical or horizontal list is available.


4.RecyclerView implements vertical and horizontal GridView effects

Design sketch



Library imports, like xml files and step 2, are not redundant.

1.Activity code

package com.xzy.testrecylerview001;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.Toast;

import com.xzy.testrecylerview001.adapter.GridAdapter;

public class VerticalGridActivity extends AppCompatActivity {
    private RecyclerView mRecyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_vertical_grid);
        initView();
        initData();
    }

    private void initView() {
        mRecyclerView = findViewById(R.id.recylerView);
    }

    private void initData() {
        int[] imgRes = new int[100];
        for (int i = 0; i < imgRes.length; i++) {
            imgRes[i] = R.mipmap.ic_launcher;
        }
        GridLayoutManager layoutManager = new GridLayoutManager(this, 4);
        //Implementing vertical GridView is set to LinearLayoutManager.VERTICAL
        //Implementing horizontal GridView is set to Linear Layout Manager. HORIZONTAL
        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        mRecyclerView.setLayoutManager(layoutManager);

        GridAdapter gridAdapter = new GridAdapter(this, true, imgRes);
        mRecyclerView.setAdapter(gridAdapter);
        gridAdapter.setOnItemClickListener(new GridAdapter.OnItemClickListener() {
            @Override
            public void onItemClickListener(int position) {
                Toast.makeText(VerticalGridActivity.this, "" + position, Toast.LENGTH_SHORT).show();
            }
        });
    }

    public static void startActivity(Activity activity) {
        Intent intent = new Intent(activity, VerticalGridActivity.class);
        activity.startActivity(intent);
    }
}


2.Adapter code

package com.xzy.testrecylerview001.adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.xzy.testrecylerview001.R;

/**
 * Function:
 * Created by xuzhuyun on 2017/11/17.
 */

public class GridAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private Context mContext;
    private int[] imgRes;
    private boolean isVertical;
    private OnItemClickListener mOnItemClickListener;

    public GridAdapter(Context mContext, boolean isVertical, int[] imgRes) {
        this.mContext = mContext;
        this.isVertical = isVertical;
        this.imgRes = imgRes;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //iew view = LayoutInflater.from(mContext).inflate(isVertical ? R.layout.item_list_v : R.layout.item_list_h, parent, false);
        View view = LayoutInflater.from(mContext).inflate(R.layout.item_list_h, parent, false);
        return new RecyclerHolder(view);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        ((RecyclerHolder) holder).setData(position);
    }


    private class RecyclerHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        LinearLayout mLinearLayout;
        ImageView mImageView;
        TextView mTextView;

        public RecyclerHolder(View itemView) {
            super(itemView);
            mLinearLayout = itemView.findViewById(R.id.item_layout);
            mImageView = itemView.findViewById(R.id.item_img);
            mTextView = itemView.findViewById(R.id.item_txt);
            mLinearLayout.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if (mOnItemClickListener != null) {
                mOnItemClickListener.onItemClickListener(getLayoutPosition());
            }
        }

        public void setData(int position) {
            mImageView.setImageResource(imgRes[position]);
            mTextView.setText("" + position);
        }
    }

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

    @Override
    public int getItemCount() {
        return imgRes == null ? 0 : imgRes.length;
    }

    public interface OnItemClickListener {
        void onItemClickListener(int position);
    }
}

5. summary

The key to implementing ListView or GridView with RecyclerView is whether the layout manager bound to RecyclerView is Linear Layout Manager or GridLayout Manager; whether it is horizontal or vertical depends on the method.

layoutManager.setOrientation();

Click events are implemented through an interface and are easy to implement.

Posted by zz50 on Fri, 08 Feb 2019 03:18:17 -0800