赞
踩
RecyclerView是可以添加多种布局的,下面就进行简单的实现。
1、先创建2个item布局
2、创建2个对应的ViewHolder
3、在getItemViewType方法中判断所需要加载的布局类型
4、在onCreateViewHolder中根据type的值判所需要填充的布局
5、在onBindViewHolder方法中绑定数据
步骤都很简单,直接贴代码了。
添加RecyclerView的依赖包:
compile 'com.android.support:recyclerview-v7:24.2.1'
1、创建两个布局:
type_one.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/left_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:text="hello!"
android:textSize="20sp" />
<TextView
android:id="@+id/right_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_gravity="right"
android:textColor="#F00"
android:text="world!"
android:textSize="20sp" />
</LinearLayout>
type_two.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/left_two_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:text="hello!"
android:textSize="20sp" />
<TextView
android:id="@+id/right_two_text"
android:textColor="#FF0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_gravity="right"
android:layout_marginRight="0dp"
android:text="world!"
android:textSize="20sp" />
</LinearLayout>
这两个布局除了第二个TextView的颜色不同之外,其他都是相同的。不要说我懒,本来就很懒!
2、创建两个ViewHolder,继承RecyclerView.ViewHolder
比较简单,直接上代码。。。
1、TypeOneHolder
public class TypeOneHolder extends RecyclerView.ViewHolder {
public TextView left;
public TextView right;
public TypeOneHolder(View itemView) {
super(itemView);
left = (TextView) itemView.findViewById(R.id.left_text);
right = (TextView) itemView.findViewById(R.id.right_text);
}
}
2、TypeTwoHolder
public class TypeTwoHolder extends RecyclerView.ViewHolder {
public TextView left;
public TextView right;
public TypeTwoHolder(View itemView) {
super(itemView);
left = (TextView) itemView.findViewById(R.id.left_two_text);
right = (TextView) itemView.findViewById(R.id.right_two_text);
}
}
3、准备数据
创建一个Person.java
public class Person {
private String name;
private String age;
private int type;
public Person() {
}
public Person(String name, String age, int type) {
this.name = name;
this.age = age;
this.type = type;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
", type=" + type +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
}
只是一个Java bean没有什么好说的了。
4、初始化数据
public class MainActivity extends AppCompatActivity {
private List<Person> list = new ArrayList<>();
private RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(new MyAdapter(this, list));
}
/**
* 初始化数据
*/
private void init() {
for (int i = 0; i < 20; i++) {
int t = new Random().nextInt(2);
Person person = new Person("jack" + i, "" + i + t, t);
list.add(person);
}
}
}
5、这是最关键的一步,配置适配器。
以上的步骤只要是懂点RecyclerView的都应该知道该怎么做,如果真的不懂的话可以百度搜索。仔细观察我们的Java bean可以发现里面有一个type属性,在初始化的时候我们随机对type进行了赋值,有0和1两个值。在RecyclerView.ViewHolder中有一个方法是getItemViewType(int position)我们可以根据每一个bean中的type的值来判断返回的类型。
public class MyAdapter extends RecyclerView.Adapter {
private Context context;
private List<Person> list;
private LayoutInflater inflater;
public MyAdapter(Context context, List<Person> list) {
this.context = context;
this.list = list;
inflater = LayoutInflater.from(context);
}
/**
* 根据type的值判断所需要创建的ViewHolder的类型和所需要填充的布局
* @param parent 所在的父布局
* @param viewType 根据getItemViewType(int position)得到数据的类型
* @return
*/
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
RecyclerView.ViewHolder holder = null;
switch (viewType) {
case 0:
holder = new TypeOneHolder(inflater.inflate(R.layout.type_one, null, false));
break;
case 1:
holder = new TypeTwoHolder(inflater.from(context).inflate(R.layout.type_two, null, false));
break;
}
return holder;
}
/**
* 绑定数据
* @param holder
* @param position
*/
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
Person person = list.get(position);
//获取数据的类型
int viewType = getItemViewType(position);
switch (viewType) {
case 0:
((TypeOneHolder) holder).left.setText(person.getName());
((TypeOneHolder) holder).right.setText(person.getAge());
break;
case 1:
((TypeTwoHolder) holder).left.setText(person.getName());
((TypeTwoHolder) holder).right.setText(person.getAge());
break;
}
}
/**
* 给数据的添加类型。我们需要添加两个布局,但是我们该如何判断那种数据所对应的布局呢?所以在这里我们通过给每一个数据添加一种类型。这里我直接将java bean的type的值作为该bean的类型进行了返回。
* @param position
* @return
*/
@Override
public int getItemViewType(int position) {
return list.get(position).getType();
}
/**
* 返回数据的数量
* @return
*/
@Override
public int getItemCount() {
return list.size();
}
}
activity_main.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">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
以上就是所有的代码!没什么水平,仅做记录使用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。