ListView和RecyclerView的分类型

分类型的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>
  1. 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值