Listview实现不同类型的布局

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Listview实现不同类型的布局相关的知识,希望对你有一定的参考价值。

打开各种客户端发现 Listview的布局多种多样,在我以前的认知中listview不是只能放一种item布局嘛,我就震惊了,现在我自己的项目上要用到这种方式那么就去做下

原理是listview 的adapter中 有这两个方法 

// 返回当前布局的样式type
    @Override
    public int getItemViewType(int position) {
        return listDatas.get(position).type;
    }

    // 返回你有多少个不同的类型的数量
    @Override
    public int getViewTypeCount() {
        return 3;
    }

 

过程 1 定义一个javabeen对象 

package com.example.listviewdemo;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by Ace on 2016/2/13.
 */
public class lIstViewItem {
    // 用于区分listview显示的不同item,告诉适配器我这是什么类型,listview适配器根据type决定怎么显示
    public int type;
    // 将要显示的数据用HashMap包装好
    public HashMap<String, Object> map;

    public lIstViewItem(int type, HashMap<String, Object> map) {
        this.type = type;
        this.map = map;
    }
}

 

2 把数据封装在泛型是我们JAVABeen对象的的数组里

package com.example.listviewdemo;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.HashMap;

/**
 * Created by Ace on 2016/2/13.
 */

public class MainActivity extends Activity {
    private ListView listView; // 页面listview
    private ListViewAdapter listViewAdapter; // listview适配器
    private ArrayList<lIstViewItem> viewItemsArraylist; // Arraylist主要装载的是传给适配器的数据集合


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
        initView();
        // 为listview设置适配器
//        ListViewAdapter listViewAdapter = new ListViewAdapter(MainActivity.this, getDatas());

    }

    private void initData() {


    }

    // 初始化页面组件及一些布局
    private void initView() {
        listView = (ListView) this.findViewById(R.id.listview);
        listViewAdapter = new ListViewAdapter(MainActivity.this, getDatas());
        listView.setAdapter(listViewAdapter);
    }

    /**
     * 这里我们用三种不同的样式进行测试
     **/
    private ArrayList<lIstViewItem> getDatas() {

        viewItemsArraylist = new ArrayList<lIstViewItem>();
        viewItemsArraylist.add(new lIstViewItem(2, getHashMapThirdType("美人鱼", "没有买卖就没有杀害", "2016-2-13")));
        viewItemsArraylist.add(new lIstViewItem(1, getHashMapSecondType("单身狗", "情人节自己过")));
        viewItemsArraylist.add(new lIstViewItem(0, getHashMapFirstType("周杰伦")));
        viewItemsArraylist.add(new lIstViewItem(0, getHashMapFirstType("周星驰")));
        viewItemsArraylist.add(new lIstViewItem(1, getHashMapSecondType("猴子", "齐天大圣孙悟空")));
        
        return viewItemsArraylist;
    }

    // 第一种样式,只传输一个数据
    private HashMap<String, Object> getHashMapFirstType(String firstTheme) {
        HashMap<String, Object> hashMap = new HashMap<String, Object>();
        hashMap.put("Theme", firstTheme);
        return hashMap;
    }

    // 第二种样式,传输两个数据
    private HashMap<String, Object> getHashMapSecondType(String secondTheme, String secondContent) {
        HashMap<String, Object> hashMap = new HashMap<String, Object>();
        hashMap.put("Theme", secondTheme);
        hashMap.put("Content", secondContent);
        return hashMap;
    }

    // 第三种样式,传输三个数据
    private HashMap<String, Object> getHashMapThirdType(String threeTheme, String threeContent, String date) {
        HashMap<String, Object> hashMap = new HashMap<String, Object>();
        hashMap.put("Theme", threeTheme);
        hashMap.put("Content", threeContent);
        hashMap.put("Date", date);
        return hashMap;
    }

}

 

adapter中设置我们现实的条目

 

package com.example.listviewdemo;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;

/**
 * Created by Ace on 2016/2/13.
 */
public class ListViewAdapter extends BaseAdapter {
    private LayoutInflater mLayoutInflater;
    private Context context;
    private ArrayList<lIstViewItem> listDatas;

    public ListViewAdapter(Context context, ArrayList<lIstViewItem> listDatas) {
        this.listDatas = listDatas;
        mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    } 

    // 返回当前布局的样式type
    @Override
    public int getItemViewType(int position) {
        return listDatas.get(position).type;
    }

    // 返回你有多少个不同的类型的数量
    @Override
    public int getViewTypeCount() {
        return 3;
    }

    @Override
    public int getCount() {
        return listDatas.size();
    }

    @Override
    public Object getItem(int position) {
        return listDatas.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        lIstViewItem listItem = listDatas.get(position);
        int Type = getItemViewType(position);//拿到当前条目的类型
        ViewHolderfirstType viewHolderfirstType = null;
        ViewHoldersecondType viewHoldersecondType = null;
        ViewHolderThirdType viewHolderThirdType = null;
        if (convertView == null) {//对类型进行判断
            switch (Type) {
            case 0:
                viewHolderfirstType = new ViewHolderfirstType();
                convertView = mLayoutInflater.inflate(R.layout.activity_first_type_item, null);
                viewHolderfirstType.tv_first_theme = (TextView) convertView.findViewById(R.id.tv_first_theme);
                viewHolderfirstType.tv_first_theme.setText(listItem.map.get("Theme").toString());
                convertView.setTag(viewHolderfirstType);

                break;
            case 1:
                viewHoldersecondType = new ViewHoldersecondType();
                convertView = mLayoutInflater.inflate(R.layout.activity_sencond_type_item, null);
                viewHoldersecondType.tv_second_content = (TextView) convertView.findViewById(R.id.tv_second_content);
                viewHoldersecondType.btn_second_theme = (Button) convertView.findViewById(R.id.btn_second_theme);
                viewHoldersecondType.tv_second_content.setText(listItem.map.get("Theme").toString());
                viewHoldersecondType.btn_second_theme.setText(listItem.map.get("Content").toString());
                 convertView.setTag(viewHoldersecondType);

                break;
            case 2:

                viewHolderThirdType = new ViewHolderThirdType();
                convertView = mLayoutInflater.inflate(R.layout.activity_third_type_item, null);
                viewHolderThirdType.tv_three_content = (TextView) convertView.findViewById(R.id.tv_three_content);
                viewHolderThirdType.et_three_theme = (EditText) convertView.findViewById(R.id.et_three_theme);
                viewHolderThirdType.tv_three_time = (TextView) convertView.findViewById(R.id.tv_three_time);
                viewHolderThirdType.et_three_theme.setText(listItem.map.get("Theme").toString());
                viewHolderThirdType.tv_three_content.setText(listItem.map.get("Content").toString());
                viewHolderThirdType.tv_three_time.setText(listItem.map.get("Date").toString());
                 convertView.setTag(viewHolderThirdType);
    

                break;
            }
        } else {
            switch (Type) {
            case 0:
                viewHolderfirstType = (ViewHolderfirstType) convertView.getTag();
                viewHolderfirstType.tv_first_theme.setText(listItem.map.get("Theme").toString());
                break;
            case 1:
                viewHoldersecondType = (ViewHoldersecondType) convertView.getTag();
                viewHoldersecondType.tv_second_content = (TextView) convertView.findViewById(R.id.tv_second_content);
                viewHoldersecondType.btn_second_theme = (Button) convertView.findViewById(R.id.btn_second_theme);
                viewHoldersecondType.tv_second_content.setText(listItem.map.get("Theme").toString());
                viewHoldersecondType.btn_second_theme.setText(listItem.map.get("Content").toString());
                break;
            case 2:
                viewHolderThirdType = (ViewHolderThirdType) convertView.getTag();
                viewHolderThirdType.tv_three_content = (TextView) convertView.findViewById(R.id.tv_three_content);
                viewHolderThirdType.et_three_theme = (EditText) convertView.findViewById(R.id.et_three_theme);
                viewHolderThirdType.tv_three_time = (TextView) convertView.findViewById(R.id.tv_three_time);
                viewHolderThirdType.et_three_theme.setText(listItem.map.get("Theme").toString());
                viewHolderThirdType.tv_three_content.setText(listItem.map.get("Content").toString());
                viewHolderThirdType.tv_three_time.setText(listItem.map.get("Date").toString());
                break;
            }

        }
        return convertView;
    }

    class ViewHolderfirstType {
        TextView tv_first_theme;
    }

    class ViewHoldersecondType {
        TextView tv_second_content;
        Button btn_second_theme;
    }

    class ViewHolderThirdType {
        EditText et_three_theme;
        TextView tv_three_content;
        TextView tv_three_time;
    }
}

 我的genymotion又挂了......................................    布局看viewholder就知道了..不写了

以上是关于Listview实现不同类型的布局的主要内容,如果未能解决你的问题,请参考以下文章

片段中ListView的setOnItemClickListener

listView 多布局

如何实现具有不同片段/布局的 ViewPager

具有不同布局的 ListView 行

ListView实现不同布局的显示

在片段中添加 ListView