Android 5.x新增控件之-RecylcerView实现ListView/GridView

来源:互联网 发布:Win10网络图标显示红叉 编辑:程序博客网 时间:2024/06/08 04:27

1.效果图


2.RecyclerView实现ListView垂直列表的步骤


RecyclerView是ListView和GridView的代替者.
RecyclerView有一套自己的回收规则,不再需要自己手动写代码去回收.

1.库导入

:compile 'com.android.support:recyclerview-v7:24.2.1'(改成自己的版本)

2.xml中加入RecyclerView控件

<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代码

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);        //测试数据        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适配器

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适配器 * 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实现list垂直列表" : "RecyclerView实现list水平列表");        }    }    @Override    public int getItemCount() {        return imgResId == null ? 0 : imgResId.length;    }}

3.RecyclerView实现ListView水平列表步骤

效果图

其中导入库文件和xml布局和2中的一模一样,不再赘述。看Activity代码

1.Activity代码

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);//设置水平        mRecyclerView.setLayoutManager(layoutManager);        //测试数据        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代码

适配器代码同2中的适配器代码一模一样。因为这里公用一个adapter,所以添加了isVertical参数,判断是垂直列表还是水平列表。


4.RecyclerView实现垂直GridView效果和水平GridView效果

效果图



库导入和xml文件和步骤2一样,不再赘述。

1.Activity代码

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);        //实现垂直GridView则设置为LinearLayoutManager.VERTICAL        //实现水平GridView则设置为LinearLayoutManager.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代码

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.总结

使用RecyclerView实现ListView或GridView,关键在于给RecyclerView绑定的布局管理器是LinearLayoutManager还是GridLayoutManager;是水平的还是垂直的,取决于方法

layoutManager.setOrientation(int);

点击事件通过接口的方式来实现,也很容易。


本文参考

原文: http://blog.csdn.net/Rozol/article/details/50225593 
微博: http://weibo.com/u/2524456400

在此感谢原作者文章。