ListView、GridView的通用型adapter

概述

本篇主要是基于之前的通用型adapter的调整。通用型的adapter中的context不再通过传入的方式进行。而是直接使用application。同时讲ViewHolder这个内部类抽取出来,不再放在通用adapter中。

通用型adapter的使用

在ListView上的使用

ListView布局,ListView的adapter

不再赘述,直接看代码:

  • ViewHolder代码:
package com.syz.example.adapter;

import android.util.SparseArray;
import android.view.View;

/**
 * Created by SYZ on 16/10/27.
 * 通用的ViewHolder。不需要继承,不关心ItemView布局中又哪些控件
 */

public class ViewHolder {

    private SparseArray<View> viewArray = new SparseArray<View>();
    private View convertView;

    /**
     * 传入convertView
     * @param convertView
     */
    public ViewHolder(View convertView) {
        this.convertView = convertView;
    }

    /**
     * 从convertView中取出对应resId的view
     * @param resId
     * @param <T>
     * @return
     */
    public < T extends View> T getView(int resId){
        View view = viewArray.get(resId);
        if (null == view){
            view = convertView.findViewById(resId);
            viewArray.put(resId,view);
        }
        return (T) view;
    }
}
  • 通用adapter即CommonAdapter
package com.syz.example.adapter;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import com.syz.example.App;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by SYZ on 16/10/27.
 * 该类是单类型通用adapter。如果需要支持多类型,需要扩展BaseAdapter的getItemViewType(int position)和
 * getViewTypeCount()两个方法。
 */

public abstract class CommonAdapter<T> extends BaseAdapter {

    private Context mContext = App.getContext();
    private List<T> data;

    public CommonAdapter(List<T> data){
        this.data = data != null?data:new ArrayList<T>();
    }

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

    @Override
    public Object getItem(int position) {
        return position >= data.size()?null:data.get(position);
    }

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

    @Override
    public int getItemViewType(int position) {
        return super.getItemViewType(position);
    }

    @Override
    public int getViewTypeCount() {
        return super.getViewTypeCount();
    }

    /**
     * 返回所有数据
     * @return
     */
    public List<T> getData(){
        return data;
    }

    /**
     * 在原有数据的基础上添加新的数据
     * @param data
     */
    public void addNewData(List<T> data){
        this.data.addAll(data);
        notifyDataSetChanged();
    }

    /**
     * 替换原有的数据
     * @param data
     */
    public void replaceAll(List<T> data){
        this.data.clear();
        this.data.addAll(data);
        notifyDataSetChanged();
    }

    /**
     * 移除某个元素
     * @param element
     */
    public void removeElement(T element){
        this.data.remove(element);
        notifyDataSetChanged();
    }

    /**
     * 根据角标移除列表中的某个元素
     * @param indext
     */
    public void removeEByIndex(int indext){
        this.data.remove(indext);
        notifyDataSetChanged();
    }

    /**
     * 返回item布局的resId
     * 在子类中实现该方法,在方法中传入item的布局id
     * @return
     */
    public abstract int getItemViewResId();

    /**
     * 该方法主要是用来替换BaseAdapter的getView方法。
     * 所以,该方法需要在子类中实现。
     * 该方法主要是拿到ItemView布局文件中的每个控件的实例
     * @param position
     * @param convertView
     * @param viewHolder
     * @return
     */
    public abstract View getItemView(int position,View convertView,ViewHolder viewHolder);

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView == null){
            convertView = View.inflate(mContext,getItemViewResId(),null);
            viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        return getItemView(position,convertView,viewHolder);
    }
}

基于上述改动,Demo实现:
ItemView的布局文件item_view

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

    <TextView
        android:id="@+id/stu_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textColor="@android:color/black"
        android:gravity="center"/>
</RelativeLayout>

MyAdapter继承CommonAdapter

package com.syz.example.adapter;

import android.view.View;
import android.widget.TextView;

import com.syz.example.R;
import com.syz.example.model.Student;

import java.util.List;

/**
 * Created by SYZ on 16/9/22.
 */
public class MyAdapter extends CommonAdapter {

    public MyAdapter(List<Student> data) {
        super(data);
    }

    @Override
    public int getItemViewResId() {
        return R.layout.item_view;
    }

    @Override
    public View getItemView(int position, View convertView, ViewHolder viewHolder) {
        TextView name = viewHolder.getView(R.id.stu_name);
        Student student = (Student) getData().get(position);
        name.setText(student.getName());
        return convertView;
    }
}

ListView的布局文件activity_list_view.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">

    <data class = ".ListBinding">

    </data>
    <RelativeLayout
        android:id="@+id/activity_list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.syz.example.listview.ListViewActivity">

        <ListView
            android:id="@+id/listview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"></ListView>
    </RelativeLayout>
</layout>

Activity的代码部分ListViewActivity

package com.syz.example.listview;

import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import com.syz.example.ListBinding;
import com.syz.example.R;
import com.syz.example.adapter.CommonAdapter;
import com.syz.example.adapter.MyAdapter;
import com.syz.example.model.Student;

import java.util.ArrayList;
import java.util.List;

public class ListViewActivity extends AppCompatActivity {

    private List<Student> list = new ArrayList<Student>();
    private ListBinding binding;
    private CommonAdapter<Student> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_list_view);
        initView();
    }

    private void initView(){
        initData();
        adapter = new MyAdapter(list);
        binding.listview.setAdapter(adapter);
    }

    private void initData() {
        list.add(new Student("Jack", "male", "007"));
        list.add(new Student("Tom", "male", "008"));
        list.add(new Student("Elven", "male", "009"));
    }
}

截图:
这里写图片描述

通用型adapter在GridView上的使用

GridView 的布局文件activity_grid_view.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">

    <data class=".GridBinding">

        <import type="android.view.View" />
    </data>

    <RelativeLayout
        android:id="@+id/activity_grid_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.syz.example.gridview.GridViewActivity">


        <GridView
            android:id="@+id/gridview"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/title_1"
            android:layout_marginTop="5dp"
            android:columnWidth="90dp"
            android:numColumns="auto_fit"
            android:stretchMode="columnWidth">

        </GridView>

    </RelativeLayout>
</layout>

GridVeiw的adapter

package com.syz.example.adapter;

import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import com.syz.example.R;

import java.util.List;

/**
 * Created by SYZ on 16/10/28.
 */

public class GridViewAdapter extends CommonAdapter{

    public GridViewAdapter(List<String> data){
        super(data);
    }

    @Override
    public int getItemViewResId() {
        return R.layout.grid_view_item;
    }

    @Override
    public View getItemView(int position, View convertView, ViewHolder viewHolder) {
        TextView itemName = viewHolder.getView(R.id.item_name);
        itemName.setText((CharSequence) getData().get(position));
        ImageView icon = viewHolder.getView(R.id.item_img);
        if (position%7 ==0){
            icon.setImageResource(R.drawable.grid_1);
        } else if(position%7 ==1){
            icon.setImageResource(R.drawable.grid_2);
        } else if (position%7 ==2){
            icon.setImageResource(R.drawable.grid_3);
        } else if (position%7 ==3){
            icon.setImageResource(R.drawable.grid_4);
        } else if (position%7 ==4){
            icon.setImageResource(R.drawable.grid_5);
        } else if (position%7 ==5){
            icon.setImageResource(R.drawable.grid_6);
        } else {
            icon.setImageResource(R.drawable.grid_7);
        }

        return convertView;
    }
}

GridView 的item布局文件grid_view_item.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data class=".GridItemBinding">

        <import type="android.view.View"></import>
    </data>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:minHeight="80dp">

        <ImageView
            android:id="@+id/item_img"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"/>

        <TextView
            android:id="@+id/item_name"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="6dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/item_img"
            android:gravity="center"
            android:textColor="#5b5a5a"
            android:textSize="12sp"
            android:text="Item"/>

    </RelativeLayout>
</layout>

GridViewActivity.java

package com.syz.example.gridview;

import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Toast;

import com.syz.example.GridBinding;
import com.syz.example.R;
import com.syz.example.adapter.GridViewAdapter;

import java.util.ArrayList;
import java.util.List;

public class GridViewActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {

    private GridBinding binding;

    private GridViewAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_grid_view);
        initView();
    }

    private void initView() {
        initData();
        adapter = new GridViewAdapter(list);
        binding.gridview.setAdapter(adapter);
        binding.gridview.setOnItemClickListener(this);
    }

    private List<String> list = new ArrayList<String>();

    private void initData() {
        list.add("百度");
        list.add("新浪");
        list.add("优酷");
        list.add("乐视");
        list.add("搜狐");
        list.add("淘宝");
        list.add("天猫");
        list.add("京东");
        list.add("当当");
        list.add("腾讯");
        list.add("阿里");
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Toast.makeText(this, "I am the item "+position, Toast.LENGTH_SHORT).show();
    }
}

截图:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值