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

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);
}
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息