您的位置:首页 > 移动开发 > Android开发

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

2015-12-17 20:41 309 查看
该读书笔记是自己阅读《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,具体看上面代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: