Android-RecyclerView(解析二)

来源:互联网 发布:简单网络协议实现 编辑:程序博客网 时间:2024/05/22 00:20

添加点击事件,以及layoutManager的使用

1、适配器的编写

package com.example.recyclerview;import java.util.List;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.TextView;public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> implements View.OnClickListener{    private Context context;    private List<String>list;    //4.1 创建接口对象    private OnChildClickListener listnener;    private RecyclerView recvclerView;    //4.2 添加set监听方法,以防止与系统重名,修改方法名setOnChildListnener    public void setOnChildClickListnener(OnChildClickListener listnener) {        this.listnener = listnener;    }    /**     * 3、MyAdapter的构造方法添加构造方法     */    public MyAdapter(Context context, List<String> list) {        this.context = context;        this.list = list;    }    /**     * 1、编写viewHolder:注意再listView当中我们编写的viewHolder是我们自定义的,但是再RecyclerView     * 中viewholder被规范化了,它需要继承自RecyclerView的viewHolder,写好自己的ViewHolder     */    public static class MyViewHolder extends RecyclerView.ViewHolder{        private TextView text;    /**     * 2、编写viewHolder的构造方法     */        public MyViewHolder(View itemView) {            super(itemView);            //2.1找到item中的text            text=(TextView) itemView.findViewById(R.id.item_text);        }    }    /**     * 3、实现它的三个抽象方法     */    /**     * 返回这个adpter中一共有多少条数据     */    @Override    public int getItemCount() {        // TODO Auto-generated method stub        return list.size();    }    /**     * 把现在的数据绑定到原有的viewHolder上     */    @Override    public void onBindViewHolder(MyViewHolder holder, int position) {        holder.text.setText(list.get(position));    }    /**     * 相当于在listview中,onCreatView为空时,需要去创建viewHolder     */    @Override    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {    View view=LayoutInflater.from(context).inflate(R.layout.item, parent,false);    //7、由adapter去实现里面的抽象方法    view.setOnClickListener(this);    return new MyViewHolder(view);    }    //8、抽象方法    @Override    public void onClick(View v) {        //8.1为了安全起见我们首先进行判断RecyclerView不能为空并且接口对象(listener)不等于空,点击事件才有用        //8.2在点击时我们要获得这个position        if(recvclerView!=null&&listnener!=null){            int position=recvclerView.getChildAdapterPosition(v);            listnener.onChildClick(recvclerView, v, position, list.get(position));        }    }    /**     * 4、添加点击事件接口(与listview不同)     */    public interface OnChildClickListener{        void onChildClick(RecyclerView parent,View view,int position,/*数据模型对象*/String data);    }    /**     * 5、连接到RecyclerView,为RecyclerView绑定数据时执行的方法     */    @Override    public void onAttachedToRecyclerView(RecyclerView recyclerView) {        // TODO Auto-generated method stub        super.onAttachedToRecyclerView(recyclerView);        this.recvclerView=recyclerView;    }    /**     * 6、与上面方法想对应,解绑的时候执行的方法     */    @Override    public void onDetachedFromRecyclerView(RecyclerView recyclerView) {        // TODO Auto-generated method stub        super.onDetachedFromRecyclerView(recyclerView);        this.recvclerView=null;    }}

在MainActivity中调用adapter的点击事件运行

package com.example.recyclerview;import java.util.ArrayList;import java.util.List;import java.util.Locale;import android.os.Bundle;import android.app.Activity;import android.support.v7.widget.RecyclerView;import android.view.Menu;import android.view.View;import android.widget.Toast;public class MainActivity extends Activity implements MyAdapter.OnChildClickListener {    private MyAdapter adapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        RecyclerView recycler=(RecyclerView) findViewById(R.id.recycler);           //添加100条假数据        List<String> list=new ArrayList<String>();        for(int i=0;i<100;i++){            list.add(String.format(Locale.CHINA, "第%03d条数据",i));        }        adapter=new MyAdapter(this, list);        recycler.setAdapter(adapter);        adapter.setOnChildClickListnener(this);    }    /**     * 点击事件     */    @Override    public void onChildClick(RecyclerView parent, View view, int position,            String data) {        //将点击的内容数据打印出来        Toast.makeText(this, data, Toast.LENGTH_SHORT).show();    }}

在adapter中添加增加和删除数据的方法:

package com.example.recyclerview;import java.util.List;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.TextView;public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> implements View.OnClickListener{    private Context context;    private List<String>list;    //4.1 创建接口对象    private OnChildClickListener listnener;    private RecyclerView recvclerView;    //4.2 添加set监听方法,以防止与系统重名,修改方法名setOnChildListnener    public void setOnChildClickListnener(OnChildClickListener listnener) {        this.listnener = listnener;    }    /**     * 3、MyAdapter的构造方法添加构造方法     */    public MyAdapter(Context context, List<String> list) {        this.context = context;        this.list = list;    }    /**     * 1、编写viewHolder:注意再listView当中我们编写的viewHolder是我们自定义的,但是再RecyclerView     * 中viewholder被规范化了,它需要继承自RecyclerView的viewHolder,写好自己的ViewHolder     */    public static class MyViewHolder extends RecyclerView.ViewHolder{        private TextView text;    /**     * 2、编写viewHolder的构造方法     */        public MyViewHolder(View itemView) {            super(itemView);            //2.1找到item中的text            text=(TextView) itemView.findViewById(R.id.item_text);        }    }    /**     * 3、实现它的三个抽象方法     */    /**     * 返回这个adpter中一共有多少条数据     */    @Override    public int getItemCount() {        // TODO Auto-generated method stub        return list.size();    }    /**     * 把现在的数据绑定到原有的viewHolder上     */    @Override    public void onBindViewHolder(MyViewHolder holder, int position) {        holder.text.setText(list.get(position));    }    /**     * 相当于在listview中,onCreatView为空时,需要去创建viewHolder     */    @Override    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {    View view=LayoutInflater.from(context).inflate(R.layout.item, parent,false);    //7、由adapter去实现里面的抽象方法    view.setOnClickListener(this);    return new MyViewHolder(view);    }    //8、抽象方法    @Override    public void onClick(View v) {        //8.1为了安全起见我们首先进行判断RecyclerView不能为空并且接口对象(listener)不等于空,点击事件才有用        //8.2在点击时我们要获得这个position        if(recvclerView!=null&&listnener!=null){            int position=recvclerView.getChildAdapterPosition(v);            listnener.onChildClick(recvclerView, v, position, list.get(position));        }    }    /**     * 9、添加删除的方法,从指定位置删除     */    public void remove(int position){        list.remove(position);        /**         * 9.1 删除后提醒刷新         * 注意:  调用notifyDataSetChanged();将无删除特殊动画效果         */        notifyItemRemoved(position);    }    /**     * 4、添加点击事件接口(与listview不同)     */    public interface OnChildClickListener{        void onChildClick(RecyclerView parent,View view,int position,/*数据模型对象*/String data);    }    /**     * 5、连接到RecyclerView,为RecyclerView绑定数据时执行的方法     */    @Override    public void onAttachedToRecyclerView(RecyclerView recyclerView) {        // TODO Auto-generated method stub        super.onAttachedToRecyclerView(recyclerView);        this.recvclerView=recyclerView;    }    /**     * 6、与上面方法想对应,解绑的时候执行的方法     */    @Override    public void onDetachedFromRecyclerView(RecyclerView recyclerView) {        // TODO Auto-generated method stub        super.onDetachedFromRecyclerView(recyclerView);        this.recvclerView=null;    }}

MainActivity调用执行:

package com.example.recyclerview;import java.util.ArrayList;import java.util.List;import java.util.Locale;import android.os.Bundle;import android.app.Activity;import android.support.v7.widget.RecyclerView;import android.view.Menu;import android.view.View;import android.widget.Toast;public class MainActivity extends Activity implements MyAdapter.OnChildClickListener {    private MyAdapter adapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        RecyclerView recycler=(RecyclerView) findViewById(R.id.recycler);           //添加100条假数据        List<String> list=new ArrayList<String>();        for(int i=0;i<100;i++){            list.add(String.format(Locale.CHINA, "第%03d条数据",i));        }        adapter=new MyAdapter(this, list);        recycler.setAdapter(adapter);        adapter.setOnChildClickListnener(this);    }    /**     * 点击事件     */    @Override    public void onChildClick(RecyclerView parent, View view, int position,            String data) {        //将点击的内容数据打印出来        Toast.makeText(this, data, Toast.LENGTH_SHORT).show();        //调用删除item方法        adapter.remove(position);    }}

layoutManager的使用:

package com.example.recyclerview;import java.util.ArrayList;import java.util.List;import java.util.Locale;import android.os.Bundle;import android.app.Activity;import android.support.v7.widget.GridLayoutManager;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.Menu;import android.view.View;import android.widget.Toast;public class MainActivity extends Activity implements MyAdapter.OnChildClickListener {    private MyAdapter adapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        RecyclerView recycler=(RecyclerView) findViewById(R.id.recycler);           //添加100条假数据        List<String> list=new ArrayList<String>();        for(int i=0;i<100;i++){            list.add(String.format(Locale.CHINA, "第%03d条数据",i));        }        adapter=new MyAdapter(this, list);        /**         * 在java代码中使用LinearLayoutManager,不在布局文件中使用         */        LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);//(垂直水平,是否翻转呈现布局)        GridLayoutManager gridLayoutManager=new GridLayoutManager(this, 3);//(列数)        //GridLayoutManager可以设置摸个item的样式        gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {            @Override            public int getSpanSize(int position) {//占多少列                if(position==0){                    return 3; //第一行占三列                }                return 1;//默认占一列            }        });        recycler.setLayoutManager(gridLayoutManager);//在xml布局中可以删掉对linearLayoutManager的引用        recycler.setAdapter(adapter);        adapter.setOnChildClickListnener(this);    }    /**     * 点击事件     */    @Override    public void onChildClick(RecyclerView parent, View view, int position,            String data) {        //将点击的内容数据打印出来        Toast.makeText(this, data, Toast.LENGTH_SHORT).show();        //调用删除item方法        adapter.remove(position);    }}
0 0