Android读书笔记之自定义RecyclerView列表项

该读书笔记是自己阅读《Android编程权威指南》和《The.Big.Nerd.Ranch.Guide.2nd.Edition》(《Android编程权威指南》第二版)所做的一些笔记。


在那篇文章(http://blog.csdn.net/u014285517/article/details/50333497)中,通过Fragment和RecyclerView显示了一个简单的列表,列表项只有一个简单的TextView。

在这篇文章中我们来自定义列表项,使其更具有实用价值,我们要实现的列表项左边有张图片,右边的上边有段对图片的描述,下边是一个按钮,并可以响应用户的点击。

如下图所示(仅作功能演示之用。。。。。):


下面我们来看下代码:

package com.example.zhan.fragmenttest;

import android.app.Fragment;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;


public class ListFragment extends Fragment {

    private RecyclerView mRecyclerView;
    private ItemAdapter mItemAdapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_list,container,false);

        mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

        //产生列表数据
        List<Item> itemList = new ArrayList<>();
        for (int i = 0;i < 100;i++) {
            Item item = new Item();
            item.setId(i);
            itemList.add(item);
        }

        mItemAdapter = new ItemAdapter(itemList);
        mRecyclerView.setAdapter(mItemAdapter);

        return view;
    }



    private class ItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        private TextView mTextView;
        private Button mButton;

        public ItemHolder(View itemView) {
            super(itemView);
            mTextView = (TextView) itemView.findViewById(R.id.textView);
            mButton = (Button) itemView.findViewById(R.id.button);
            mButton.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            Toast.makeText(getActivity(),"Press",Toast.LENGTH_LONG).show();
        }

    }

    private class ItemAdapter extends RecyclerView.Adapter<ItemHolder> {

        private List<Item> mItems;

        public ItemAdapter(List<Item> items) {
            mItems = items;
        }

        @Override
        public ItemHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
            LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
            //
            View view = layoutInflater.inflate(R.layout.list_item,
                    viewGroup,false);
            return new ItemHolder(view);
        }

        @Override
        public void onBindViewHolder(ItemHolder viewHolder, int i) {
            Item item = mItems.get(i);
            //这里开始直接传数值,结果被当做资源ID了。。。。。
            //然后就android.content.res.Resources$NotFoundException
            viewHolder.mTextView.setText(String.valueOf(item.getId()));
            viewHolder.mButton.setText(String.valueOf(item.getId()));
        }

        @Override
        public int getItemCount() {
            return mItems.size();
        }

    }

}

这段代码与那篇文章代码的主要的区别有如下几点:

第一:将View view = layoutInflater.inflate(android.R.layout.simple_list_item_1, viewGroup,false); 

改成了View view = layoutInflater.inflate(R.layout.list_item,viewGroup,false);就是原来用的是Android系统自带的布局文件android.R.layout.simple_list_item_1,现在我们自定义了列表项的布局文件list_item.xml,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/h5"
        android:padding="4dp"
        android:layout_marginLeft="16dp"/>

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="4dp"
        android:text="textView"
        android:layout_toRightOf="@+id/imageView"
        android:layout_marginLeft="16dp"
        />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/imageView"
        android:layout_below="@+id/textView"
        android:text="button"
        android:layout_marginLeft="16dp"
        />

</RelativeLayout>

第二:RecyclerView.ViewHolder实现了View.OnClickListener接口,并为按钮添加监听器,这里我们对按钮的响应就简单的弹出个Toast,具体看上面代码。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值