ListView和RecyclerView的分类型
2016-07-15 21:32
363 查看
分类型的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); } } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories