您的位置:首页 > 其它

ListView、GridView的通用型adapter

2016-10-27 17:21 330 查看

概述

本篇主要是基于之前的通用型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();
}
}


截图:

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