cathome 猫家 开发日记-数据选择器

概述:

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);
                }
            }
        });
原文地址:https://www.cnblogs.com/lsfv/p/9836878.html