概述:
1.item 必须复用。也就是adapter要自定义。
2.自定义adapter提供多种viewgroup使用,所以所有显示样式和逻辑放入adapter,
3.自定义adapter提供多种viewgroup使用,但自定义adapter本身并不是一个类似simpleadapter,可二次定制的 adapter.固定了layout
4. 触发事件,交给viewgroup 。但事件逻辑交给adapter.
所以开发
1.定义数据结构。
2.定义item layout
3.自定义 于基类baseadapter.
4.建立普通activity,使用gridview,listview 进行测试。
1.数据结构
public class LSStructDisplayValue { public String display; public int intValue; }
2.定义item layout
<?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/tvik" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:layout_marginStart="20dp" android:layout_marginTop="15dp" android:text="TextView" style="@style/TextStyleRadioUnSelected" /> </RelativeLayout>
3.自定义 于基类baseadapter.
package com.linson.android.studyapp.Adapter; import android.content.Context; import android.graphics.Color; import android.support.annotation.IdRes; import android.support.annotation.LayoutRes; import android.support.annotation.NonNull; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.SimpleAdapter; import android.widget.TextView; import com.linson.LSLib.CommonFunction.LSStructDisplayValue; import com.linson.android.studyapp.R; import java.util.List; import java.util.TreeMap; //1.layout R.layout.girdview_textview 2.data:LSStructDisplayValue public class SelectorAdapter extends BaseAdapter { public enum SingleOrMultiple { singler, multiple } private Context mContext; private List<LSStructDisplayValue> mData; private List<LSStructDisplayValue> mSelected; private SingleOrMultiple mtype; public SelectorAdapter(Context context, List<LSStructDisplayValue> data,List<LSStructDisplayValue> preSelected,SingleOrMultiple type) { mContext=context; mData=data; mSelected=preSelected; mtype=type; } @Override public int getCount() { return mData.size(); } @Override public Object getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View itemView=View.inflate(mContext,R.layout.girdview_textview, null); TextView tv=itemView.findViewById(R.id.tvik); tv.setText(mData.get(position).display); if(IsContian(mSelected, mData.get(position).intValue)) { tv.setTextColor(mContext.getResources().getColor(R.color.color_cat_green)); } else { tv.setTextColor(mContext.getResources().getColor(R.color.color_cat_grey)); } return itemView; } private boolean IsContian(List<LSStructDisplayValue> data ,int value) { boolean ret=false; for(LSStructDisplayValue item : data) { if(item.intValue==value) { ret=true; break; } } return ret; } public void ChangeSelector(int positon) { if(mtype==SingleOrMultiple.singler) { mSelected.clear(); mSelected.add(mData.get(positon)); } else if(mtype==SingleOrMultiple.multiple) { boolean isContain=false; int existPosition=-1; for(int i=0;i<mSelected.size();i++) { if(mSelected.get(i).intValue==mData.get(positon).intValue) { isContain=true; existPosition=i; break; } } if(isContain) { mSelected.remove(existPosition); } else { mSelected.add(mData.get(positon)); } } } }
4.建立普通activity,使用gridview,listview 进行测试。
<?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"> <GridView android:id="@+id/testgv" android:numColumns="2" android:layout_width="match_parent" android:layout_height="108dp" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:layout_marginStart="0dp" android:layout_marginTop="19dp" /> <ListView android:id="@+id/testlv" android:layout_width="match_parent" android:layout_height="171dp" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:layout_marginStart="0dp" android:layout_marginTop="152dp" /> </RelativeLayout>
final SelectorAdapter gvadapter=new SelectorAdapter(this, mm,sele , SelectorAdapter.SingleOrMultiple.singler); gv.setAdapter(gvadapter); gv.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { gvadapter.ChangeSelector(position); gvadapter.notifyDataSetChanged(); for(LSStructDisplayValue item :sele) { Log.i("debug", "onItemClick: "+item.display); } } }); final SelectorAdapter lvadapter=new SelectorAdapter(this, mm,sele2 , SelectorAdapter.SingleOrMultiple.multiple); lv.setAdapter(lvadapter); lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { lvadapter.ChangeSelector(position); lvadapter.notifyDataSetChanged(); for(LSStructDisplayValue item :sele2) { Log.i("debug", "onItemClick: "+item.display); } } });