[Android]RecyclerView

创建RecyclerView

在build.gradle中添加依赖

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:25.1.0'

    // DONE (1) Add RecyclerView dependency
    compile 'com.android.support:recyclerview-v7:25.1.0'
}

在资源文件中的使用RecyclerView

<android.support.v7.widget.RecyclerView
    android:layout_height="match_parent"
    android:layout_width="match_parent" />

在RecyclerView中添加Item

在Res/layout资源文件中添加number_list_item, 每个item是一个Framlayout其中仅包括一个TextView

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="wrap_content"
    android:padding="16dp">

    <TextView
        android:id="@+id/tv_item_number"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:textAlignment="textStart"
        android:textSize="42sp"
        android:fontFamily="monospace"/>
</FrameLayout>

在Java文件中,创建一个新的类GreenAdapter 继承于RecyclerView.Adapter, 在GreenAdapter中创建一个内部类NumberViewHolder 继承于RecyclerView.ViewHolder.

class NumberViewHolder extends RecyclerView.ViewHolder {


    TextView listItemNumberView;

    public NumberViewHolder(View itemView) {
        super(itemView);
        listItemNumberView = (TextView) itemView.findViewById(R.id.tv_item_number);

    }
    void bind(int listIndex) {
        listItemNumberView.setText(String.valueOf(listIndex));
    }
}

bind()函数是用来改变每个Item中TextView的内容.

在RecyclerView与Adapter

RecyclerView

Adapter

Adapter的作用:
- 创建新的item
- 向item中填充数据
- 返回信息

首先我们要先创建GreenAdapter类, 继承于RecyclerView.Adapter

public class GreenAdapter extends RecyclerView.Adapter<GreenAdapter.NumberViewHolder>{

Adapter需要我们重写3个函数:

  • onCreateViewHolder : 用于RecyclerView实例化一个新的ViewHolder实例 (inflate itemviews, 创建并返回ViewHolder)
@Override
public NumberViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    Context context = viewGroup.getContext();
    int layoutIdForListItem = R.layout.number_list_item;
    LayoutInflater inflater = LayoutInflater.from(context);
    boolean shouldAttachToParentImmediately = false;

    View view = inflater.inflate(layoutIdForListItem, viewGroup, shouldAttachToParentImmediately);
    NumberViewHolder viewHolder = new NumberViewHolder(view);

    return viewHolder;
}
  • onBindViewHolder : 用于向模型中填充数据,使用户可以看到它的时候调用, 更有效的绑定数据源
@Override
public void onBindViewHolder(NumberViewHolder holder, int position) {
    Log.v("NumberViewHolder","bind "+ position);
    holder.bind(position);
}
  • getItemCount : 用于返回数据源中的显示的项目数 (有助于Layout View 管理后台的动画)
@Override
public int getItemCount() {
   return mNumberItems;
}

RecyclerView布局管理器

这里有3种布局管理器:
LinearLayoutManager - 线型
GridLayoutManager - 网格型
StaggeredGridLayoutManager - 交错型

public class MainActivity extends AppCompatActivity {

    private static final int NUM_LIST_ITEMS = 100;
    GreenAdapter mAdapter;
    RecyclerView mNumberList;

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

        mNumberList = (RecyclerView) findViewById(R.id.rv_numbers);

        // 创建 LinearLayoutManager
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        mNumberList.setLayoutManager(layoutManager);

        // RecyclerView的内容不会改变item的尺寸
        mNumberList.setHasFixedSize(true);

        mAdapter = new GreenAdapter(NUM_LIST_ITEMS);

        // 对RecyclerView设置Adapter
        mNumberList.setAdapter(mAdapter);
    }
}

处理点击操作
要让RecyclerView响应点击事件需要:
1. 创建一个ListItemClickListener的接口
2. 在NumberViewHolder中实现 View.OnClickListener

GreenAdapter.java

首先在GreenAdapter中创建一个ListItemClickListener的接口, 方法中的num参数是点击事件中,被点击项目的编号。

// DONE (1) Add an interface called ListItemClickListener
// DONE (2) Within that interface, define a void method called onListItemClick that takes an int as a parameter
interface ListItemClickListener{
    void onListItemClick(int num);
}

在GreenAdapter中添加final属性的成员变量ListItemClickListener,

// DONE (3) Create a final private ListItemClickListener called mOnClickListener
private final ListItemClickListener mOnClickListener;

……
并在GreenAdapter的构造函数中,初始化这个成员变量。

// DONE (4) Add a ListItemClickListener as a parameter to the constructor and store it in mOnClickListener
   public GreenAdapter(int numberOfItems, ListItemClickListener onClickListener) {
    mNumberItems = numberOfItems;
    mOnClickListener = onClickListener;
    viewHolderCount = 0;
}

让GreenAdapter中的NumberViewHolder实现View.OnclickListener接口, 并把Lisener传递给itemView。

// DONE (5) Implement OnClickListener in the NumberViewHolder class
class NumberViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

    public NumberViewHolder(View itemView) {
        super(itemView);

        listItemNumberView = (TextView) itemView.findViewById(R.id.tv_item_number);
        viewHolderIndex = (TextView) itemView.findViewById(R.id.tv_view_holder_instance);
        // DONE (7) Call setOnClickListener on the View passed into the constructor (use 'this' as the OnClickListener)
        itemView.setOnClickListener(this);
    }

    。。。


    // DONE (6) Override onClick, passing the clicked item's position (getAdapterPosition()) to mOnClickListener via its onListItemClick method
    @Override
    public void onClick(View v) {
       int position = getAdapterPosition();
       mOnClickListener.onListItemClick(position);
    }

}

MainActivity.java

在MainActivity中实现我们刚刚创建的接口

// DONE (8) Implement GreenAdapter.ListItemClickListener from the MainActivity
public class MainActivity extends AppCompatActivity implements GreenAdapter.ListItemClickListener{

    // DONE (9) Create a Toast variable called mToast to store the current Toast
    private Toast mToast;

。。。

    // DONE (10) Override ListItemClickListener's onListItemClick method
    @Override
    public void onListItemClick(int num) {
        // DONE (11) In the beginning of the method, cancel the Toast if it isn't null
        // DONE (12) Show a Toast when an item is clicked, displaying that item number that was clicked
        if(mToast != null)
            mToast.cancel();
        mToast = Toast.makeText(this,num + " is clicked", Toast.LENGTH_SHORT);
        mToast.show();
    }

}

在onCreate()中,把MainActivity传入作为Listener。

mAdapter = new GreenAdapter(NUM_LIST_ITEMS, this);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值