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(); } }
截图:
相关文章推荐
- Android三级目录、ListView单选/GridView单选、ListView多选/GridView多选
- 背水一战 Windows 10 (58) - 控件(集合类): ListViewBase - ListView, GridView
- 编写通用的Listview、gridview的适配器
- ScrollView嵌套ListView,GridView数据加载不全问题的解决
- ReactNative基础(四)了解ListView的使用、实现GridView效果、编写一个真实网络请求案例
- GridView ListView 嵌套 ScrollView 解决方案
- ScrollView 下嵌套 ListView 或 GridView 冲突显示不全问题
- RecyclerView 实现listview和gridview布局(各自的子布局不同,网络数据)
- ListView和GridView的item自动改变边距!
- ListView、ScrollView、GridView滑动到顶端或底部的阴影效果去掉
- PullToRefresh上拉加载下拉刷新GridView和ListView
- ScrollView中嵌套ListView或GridView,只显示一行
- AutoCompleteListView,Spinner,Gallery,GridView,ExpandableListView(界面颜值逆天)
- Android学习笔记(十二):ListView和GridView
- Android ScrollView与ListView,GridView共存冲突解决方案
- android GridView,Gallery,ListView
- ListView实现GridView
- [置顶] 一个适用于ListView/GridView/RecyclerView的通用适配器
- 在ListView中使用GridView, Style这样写:
- (转)Android PullToRefresh (ListView GridView 下拉刷新) 使用详解