添加点击事件,以及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);
}
}