你的位置:首页 > 操作系统

[操作系统]自定义列表视图


通过继承BaseAdapter写一个子类,可以创建自定义列表视图:(以下代码注释很少,仅供自己日后查阅)

public class MyListAdapter extends BaseAdapter {

    private LayoutInflater mInflater;//声明一个LayoutInflater类变量

    private Context mContext;//声明一个Context类变量

    private List<Map<String,String>> mitem;//声明一个元素为<Map<String,String>>类型的List对象,存储testitem的值

    private Map<String,Integer> selectedtestItem = new HashMap<String,Integer>();//声明一个Map对象,用HashMap来实现

    private List<Map<String, String>> mData; // 声明一个元素为<Map<String,String>>类型的List对象,存储的editTex值

    private Map<String, String> editorValue = new HashMap<String, String>();//声明一个Map对象,用HashMap来实现

    private List<Map<String,String>> mParameter;//用于保存parameter_edit参数值

    //private static HashMap<Integer, Boolean> isSelected;//声明一个HashMap<Integer,Boolean>类型的变量

    private String[] testItems;

    private String promptForSpinner[] = {"0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19"};

    

    public MyListAdapter(Context context,String[] testItems) {//构造函数

        // TODO Auto-generated constructor stub

        mInflater = LayoutInflater.from(context);//获得LayoutInflater

        this.testItems = testItems;

        puttestitemName();

    }

    private void puttestitemName()

    {

        for (String str : promptForSpinner) {

            selectedtestItem.put(str,0);

        }

        /*for(int i=0;i<20;i++){

            selectedtestItem.put("list_item_Name", 0);//allValues保存以项目名称为键值、0为数值的一系列成对的数据

        }*/

    }

    public void setData( List<Map<String, String>> data) {//初始化Lisr类型的对象

        mData = data;

        mParameter=data;

        init();

    }

    private void init() {//实现初始化List类型的对象的方法

        editorValue.clear();

        /*isSelected = new HashMap<Integer, Boolean>();

        if (mData != null) {

            for (int i = 0; i < mData.size(); i++) {

                isSelected.put(i, false);

            }

        }*/

    }

    public Map<String,Integer> getSelectedtestItem()

    {

    return selectedtestItem;

    }

    

    public List<Map<String,String>> getmData()

    {

    return mData;

    }

    public List<Map<String,String>> getmParameter()

    {

        return mParameter;

    }

    @Override

    public int getCount() {//获得List类型对象的长度;

        // TODO Auto-generated method stub

        if (mData != null) {

            return mData.size();

        }

        return 0;

    }

    @Override

    public Object getItem(int position) {

        // TODO Auto-generated method stub

        return null;

    }

    @Override

    public long getItemId(int position) {

        // TODO Auto-generated method stub

        return 0;

    }

    private Integer index = -1;//声明并初始化一个整型变量index

//Adapter是ListView界面与数据之间的桥梁。当列表里的每一项要显示时,都会调用Adapter的getView方法返回一个View。

    @Override

    public View getView(final int position, View convertView, ViewGroup parent) {

        // TODO Auto-generated method stub

        Log.d("zhang", "position = " + position);//Log.d的输出颜色是蓝色的,仅输出debug调试的意思,但他会输出上层的信息,过滤起来可以通过DDMS的Logcat标签来选择.

        final ViewHolder holder;

        if (convertView == null) {

            convertView = mInflater.inflate(R.layout.listitem, null);//实例化R.layout.list为converView的View对象

            holder = new ViewHolder();//ViewHolder就是一个静态类,使用它缓存了数据的视图(View),加快UI的响应速度。

            //holder.checkBox = (CheckBox) convertView

                    //.findViewById(R.id.checkbox);

            

            holder.testitemSpinner = (Spinner)convertView.findViewById(R.id.testitems_select);

            //if(holder.testitemSpinner.getCount()==0)

            //if(holder.testitemSpinner.getPrompt()==null)

            //{

                ArrayAdapter<String> a = new ArrayAdapter<String>(

                convertView.getContext(),android.R.layout.simple_spinner_item,testItems);

                holder.testitemSpinner.setAdapter(a);

            //}

            //holder.testitemSpinner.setTag(position);

            holder.testitemSpinner

            .setOnItemSelectedListener(new ItemClickSelectListener(

                    holder));//为checkinfo_item_value(Spinner)添加ItemSelectedListener监听器

            holder.unit_text = (TextView) convertView.findViewById(R.id.unit_text);

            //holder.textView = (TextView) convertView.findViewById(R.id.text);

            holder.downbtn = (Button) convertView.findViewById(R.id.downbtn);

            holder.downbtn.setFocusable(false);

            holder.downbtn.setFocusableInTouchMode(false);

            holder.upbtn = (Button) convertView.findViewById(R.id.upbtn);

            holder.upbtn.setFocusable(false);

            holder.upbtn.setFocusableInTouchMode(false);

            holder.editbtn = (Button)convertView.findViewById(R.id.editbtn);

            holder.editbtn.setFocusable(false);

            holder.editbtn.setFocusableInTouchMode(false);

            /*times_edit控件*/

            holder.numEdit = (EditText) convertView.findViewById(R.id.times_edit);

            holder.numEdit.setTag(position);//给numEdit添加一个格外的数据,使用getTag()可将数据取出;

            holder.numEdit.setOnTouchListener(new OnTouchListener() {

                @Override

                public boolean onTouch(View v, MotionEvent event) {

                    // TODO Auto-generated method stub

                    if (event.getAction() == MotionEvent.ACTION_UP) {

                        index = (Integer) v.getTag();

                    }

                    return false;

                }

            });

            /***********/

            /*parameter_edti控件*/

            holder.paraEdit = (EditText) convertView.findViewById(R.id.parameter_edit);

            holder.paraEdit.setTag(position);//给numEdit添加一个格外的数据,使用getTag()可将数据取出;

            holder.paraEdit.setOnTouchListener(new OnTouchListener() {

                @Override

                public boolean onTouch(View v, MotionEvent event) {

                    // TODO Auto-generated method stub

                    if (event.getAction() == MotionEvent.ACTION_UP) {

                        index = (Integer) v.getTag();

                    }

                    return false;

                }

            });

            /*******/

            /*为times_edit控件添加编辑响应*/

            class MyTextWatcher implements TextWatcher {

 

                public MyTextWatcher(ViewHolder holder) {

                    mHolder = holder;

                }

                private ViewHolder mHolder;

                @Override

                public void beforeTextChanged(CharSequence s, int start,

                        int count, int after) {

                    // TODO Auto-generated method stub

 

                }

                @Override

                public void onTextChanged(CharSequence s, int start,

                        int before, int count) {

                    // TODO Auto-generated method stub

                }

                @Override

                public void afterTextChanged(Editable s) {

                    // TODO Auto-generated method stub

                    if (s != null && !"".equals(s.toString())) {

                        int position = (Integer) mHolder.numEdit.getTag();

                        // 当EditText数据发生改变的时候存到data变量中

                        mData.get(position).put("list_item_timesvalue",

                                s.toString());

                    }

                }

            }

            holder.numEdit.addTextChangedListener(new MyTextWatcher(holder));

            /*********/

            /*为parameter_edit控件添加编辑响应*/

            class ParaTextWatcher implements TextWatcher {

                public ParaTextWatcher(ViewHolder holder) {

                    mHolder = holder;

                }

                private ViewHolder mHolder;

                @Override

                public void beforeTextChanged(CharSequence s, int start,

                        int count, int after) {

                    // TODO Auto-generated method stub

 

                }

                @Override

                public void onTextChanged(CharSequence s, int start,

                        int before, int count) {

                    // TODO Auto-generated method stub

 

                }

                @Override

                public void afterTextChanged(Editable s) {

                    // TODO Auto-generated method stub

                    if (s != null && !"".equals(s.toString())) {

                        int position = (Integer) mHolder.numEdit.getTag();

                        // 当EditText数据发生改变的时候存到data变量中

                        mParameter.get(position).put("list_item_parameter",

                                s.toString());

                    }

                }

            }

            holder.paraEdit.addTextChangedListener(new ParaTextWatcher(holder));

            /********/

            holder.downbtn.setOnClickListener(new OnClickListener() {

                @Override

                public void onClick(View v) {

                    // TODO Auto-generated method stub

                    int position = (Integer) holder.numEdit.getTag();

                    Log.d("zhang", "clickposition = " + position);

                    String edittextStr = holder.numEdit.getText().toString();

                    int num = Integer.parseInt(edittextStr);

                    num--;

                    mData.get(position).put("list_item_timesvalue", num+"");

                    holder.numEdit.setText(num+"");

                }

            });

            holder.upbtn.setOnClickListener(new OnClickListener() {

                @Override

                public void onClick(View v) {

                    // TODO Auto-generated method stub

                    int position = (Integer) holder.numEdit.getTag();

                    String edittextStr = holder.numEdit.getText().toString();

                    int num = Integer.parseInt(edittextStr);

                    num++;

                    mData.get(position).put("list_item_timesvalue", num+"");

                    holder.numEdit.setText(num+"");

                }

            });

            convertView.setTag(holder);

        } else {

            holder = (ViewHolder) convertView.getTag();

            holder.numEdit.setTag(position);

            holder.paraEdit.setTag(position);

        }

        /*holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            

            @Override

            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                // TODO Auto-generated method stub

                int position = (Integer) holder.numEdit.getTag();

                isSelected.put(position, isChecked);//将对应position键值的数值设置为isChecked()返回的值

            }

        });

        holder.checkBox.setChecked(isSelected.get(position));//更新CheckBox的选择状态*/

        holder.testitemSpinner.setPrompt(promptForSpinner[position]);

        int spinnerOptionPosition = selectedtestItem.get(promptForSpinner[position]);

        holder.testitemSpinner.setSelection(spinnerOptionPosition);

        //if ((spinnerOptionPosition==4)||(spinnerOptionPosition==5))

            //holder.unit_text.setText("hz");

        //else

            //holder.unit_text.setText("__");

        

        Object value = mData.get(position).get("list_item_timesvalue");

        if (value != null && !"".equals(value)) {

            holder.numEdit.setText(value.toString());

        } else {

            holder.numEdit.setText("200");

        }

        holder.numEdit.clearFocus();

        if (index != -1 && index == position) {

            holder.numEdit.requestFocus();

        }

        Object value2 = mParameter.get(position).get("list_item_parameter");

        if (value2 != null && !"".equals(value2)) {

            holder.paraEdit.setText(value2.toString());

        } else {

            holder.paraEdit.setText("200");

        }

        holder.paraEdit.clearFocus();

        if (index != -1 && index == position) {

            holder.paraEdit.requestFocus();

        }

        return convertView;

    }

    

    /*public HashMap<Integer,Boolean> getIsSelected() {

return isSelected;

}*/

 

/*public void setIsSelected(HashMap<Integer,Boolean> isSelected) {

this.isSelected = isSelected;

}*/

    public class ViewHolder {

        Spinner testitemSpinner;

        Button editbtn;

        Button downbtn;

        EditText numEdit;

        EditText paraEdit;

        TextView unit_text;

        Button upbtn;

 

    }

    private class ItemClickSelectListener implements OnItemSelectedListener {

        //Spinner testitemSpinner;

        ViewHolder Iholder;

        //EditText Iedit;

        public ItemClickSelectListener(ViewHolder holder) {

            //this.testitemSpinner = testitemSpinner;

            this.Iholder = holder;

        }

        @Override

        public void onItemSelected(AdapterView<?> parent, View view,

                int position, long id) {

            //关键代码

            selectedtestItem.put(Iholder.testitemSpinner.getPrompt().toString(), position);

            /*根据所选的测试项目,改变第二参数的不同单位和信息*/

            if((position==4)||(position==5))

                Iholder.unit_text.setText("hz");

            else

                Iholder.unit_text.setText("un");

            if((position==0)||(position==1)||(position==2)||(position==6)||(position==7)||(position==8))

                {

                //Iholder.paraEdit.setText("null");

                Iholder.paraEdit.setVisibility(View.INVISIBLE);

                Iholder.unit_text.setVisibility(View.INVISIBLE);

                }

            else

                {

                //Iholder.paraEdit.setText("200");

                Iholder.paraEdit.setVisibility(View.VISIBLE);

                Iholder.unit_text.setVisibility(View.VISIBLE);

                }

            /***********/

            if(position==8)

                Iholder.editbtn.setVisibility(View.VISIBLE);

            else

                Iholder.editbtn.setVisibility(View.INVISIBLE);

 

            //int p = (Integer) testitemSpinner.getTag();

            //selectedtestItem.get(p).put("list_item_Name",

                    //position);

        }

        @Override

        public void onNothingSelected(AdapterView<?> arg0) {

        }

    }

}


 

ListView listView = (ListView) findViewById(R.id.list);

MyListAdapter mAdapter = new MyListAdapter(this,testItems);//testItems是一个String数组;

listView.setAdapter(mAdapter);