分类型的ListView
在android 开发过程中我们通常使用到的ListView每条数据都是相同的,但是在某些时候,这不能满足我们的项目的开发需求,比如我们要在ListView中显示步同的布局风格这时候该怎么办,怎么办???不要着急,这时候分类型的ListView就派上用处了。简单粗暴的上代码把,理论是用于实践 。
1.主布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#55000000"
android:gravity="center"
android:text="分类型的ListView"
android:textColor="#ff0000"
android:textSize="19sp" />
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
2.相应类型一的布局文件,就是是显示一个Textview
<?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="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/textview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#55ff0000"
android:gravity="center"
android:text="我爱北京天安门"
android:textColor="#ffffff"
android:textSize="15sp" />
</LinearLayout>
3.相应类型二的布局文件,就是是显示一个Editview
<?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="wrap_content"
android:orientation="vertical">
<EditText
android:id="@+id/editview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#6600ff00"
android:gravity="right"
android:hint="我是editView"
android:paddingRight="10dp"
android:textSize="16sp" />
</LinearLayout>
- Activity的代码
package com.zhang.zs.listview;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ListView listview;
private List<String> alldata ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化数据
listview = (ListView) findViewById(R.id.listview);
//设置假数据
setData();
//设置适配器
listview.setAdapter(new MyListViewAdapter(MainActivity.this,alldata));
}
/**
* 设置假数据
*/
private void setData() {
alldata= new ArrayList<>();
for (int i = 0; i < 100; i++) {
alldata.add("中国人民万岁" + i);
}
}
}
5.Adapte代码 和普通的ListView区别就在这
package com.zhang.zs.listview;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.TextView;
import java.util.List;
/**
* Created by zs on 2016/7/15.
*/
class MyListViewAdapter extends BaseAdapter {
private final Context context;
private final List<String> alldata;
public MyListViewAdapter(Context context, List<String> alldata){
this.context=context;
this.alldata=alldata;
}
@Override
public int getCount() {
return alldata.size();
}
// 分类型ListView 必须重写此方法
@Override
public int getItemViewType(int position) {
if (position%2 == 0) {
//显示tetxview类型
return 0;
} else {
//显示EditView类型的
return 1;
}
}
//标识ListView中有几种类型的布局
@Override
public int getViewTypeCount() {
//为了简单,只要明白了其中的道理就可以,
// 返回值就直接写了,暂时没写成全局常量的形式,只演示两种类型
return 2;
}
@Override
public Object getItem(int position) {
return alldata.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
// if(convertView==null){
// convertView=View.inflate(context,R.layout.textview,null);
// viewHolder=new ViewHolder();
// viewHolder.textView= (TextView) convertView.findViewById(R.id.textview);
// convertView.setTag(viewHolder);
//
// }else {
// viewHolder= (ViewHolder) convertView.getTag();
// }
//
// viewHolder.textView.setText(alldata.get(position));
int type = getItemViewType(position);
if (convertView == null) {
viewHolder = new ViewHolder();
convertView=initView(convertView,viewHolder,type);
convertView.setTag(viewHolder);
}else{
viewHolder= (ViewHolder) convertView.getTag();
}
switch (type) {
case 0:
viewHolder.textView.setText(alldata.get(position));
break;
case 1:
viewHolder.editText.setText(alldata.get(position));
break;
}
return convertView;
}
private View initView(View convertView, ViewHolder viewHolder, int type) {
switch (type) {
case 0:
convertView = View.inflate(context, R.layout.textview, null);
viewHolder.textView = (TextView) convertView.findViewById(R.id.textview);
break;
case 1:
convertView = View.inflate(context, R.layout.editview, null);
viewHolder.editText = (EditText) convertView.findViewById(R.id.editview);
break;
}
return convertView;
}
class ViewHolder {
private TextView textView;
private EditText editText;
}
}
Listview的分类型就是以上代码,虽然比较简单但是就是这样的思路,主要是重写BaseAdapter中 的 (注意 getItemViewType(int position) 返回值 一定要从0开始,开始我是从1开始数据和效果也能出来但是,当我滑动的时候,就会报数组溢出的错误)
// 分类型ListView 必须重写此方法
@Override
public int getItemViewType(int position) {
if (position%2 == 0) {
//显示tetxview类型
return 0;
} else {
//显示EditView类型的
return 1;
}
}
//标识ListView中有几种类型的布局
@Override
public int getViewTypeCount() {
//为了简单,只要明白了其中的道理就可以,
// 返回值就直接写了,暂时没写成全局常量的形式,只演示两种类型
return 2;
}
效果图
RecyclerView的分类型
RecyclerView的分类型和ListView差不多,唯一不同的就是,在适配器中
重写的方法不一样的,RecyclerView可以返回类型不收限制,而Listview
只能返回类型是根据 getViewTypeCount()方法的返回值范围,相比较
RecyclerView的更为 灵活。话不对说上代码
1.布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<android.support.v7.widget.RecyclerView
android:id="@+id/recylerview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
2.不同类型的布局和Listview相同
3.初始化布局和设置数据,设置适配器代码的Activity
package com.zhang.zs.listview;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
public class RecycleViewActivity extends AppCompatActivity {
private RecyclerView recylerview;
private List<String> allDatas;
private RecylerAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycle_view);
initData();
setData();
adapter=new RecylerAdapter(RecycleViewActivity.this,allDatas);
recylerview.setAdapter(adapter);
recylerview.setLayoutManager(new LinearLayoutManager(this));
}
private void setData() {
allDatas=new ArrayList<>();
for(int i=0;i<40;i++){
allDatas.add("我爱你中国"+i);
}
}
private void initData() {
recylerview = (RecyclerView)findViewById(R.id.recylerview);
}
}
4.适配器类
package com.zhang.zs.listview;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
import java.util.List;
/**
* Created by zs on 2016/7/16.
*/
public class RecylerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final Context context;
private final List<String> data;
public RecylerAdapter(Context context, List<String> allDatas) {
this.context = context;
this.data=allDatas;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//viewtype就是 getItemViewType(int position)的返回值
switch (viewType){
case 1: //类型一文本类型
View view= LayoutInflater.from(context).inflate(R.layout.textview,parent,false);
return new MyViewholder1(view);
case 2: //类型二
View view1 =LayoutInflater.from(context).inflate(R.layout.editview,parent,false);
return new MyViewholder2(view1);
}
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
int type = getItemViewType(position);
switch (type){
case 1:
MyViewholder1 viewholder1= (MyViewholder1) holder;
viewholder1.textview.setText(data.get(position));
break;
case 2:
MyViewholder2 viewholder2= (MyViewholder2) holder;
viewholder2.edittext.setText(data.get(position));
break;
}
}
@Override
public int getItemCount() {
return data.size();
}
@Override
public int getItemViewType(int position) {
if(position%2==0){
return 1;
}else {
return 2;
}
}
//类型一
class MyViewholder1 extends RecyclerView.ViewHolder {
private TextView textview;
public MyViewholder1(View itemView) {
super(itemView);
textview= (TextView) itemView.findViewById(R.id.textview);
}
}
//类型2
class MyViewholder2 extends RecyclerView.ViewHolder {
private EditText edittext;
public MyViewholder2(View itemView) {
super(itemView);
edittext= (EditText) itemView.findViewById(R.id.editview);
}
}
}
--------------------- 本文来自 苏打水解渴 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/baidu_31956557/article/details/51921158?utm_source=copy