使用布尔数组和类对象与baseadapter类中的列表有什么区别

时间:2014-06-13 09:44:49

标签: android listview arraylist boolean android-viewholder

我正在使用带有列表视图的复选框,方法是将基本适配器类扩展到" cust_listadapter"(自定义适配器)。在这个当我使用布尔数组来保存选中复选框时,代码运行正常,但是当我使用带有数组列表的对象(bean)时,代码没有正确运行。每当我选中一个复选框,然后所有复选框见过选择。     下面,我已经展示了我的代码。

     public class MainActivity extends Activity {
    ListView l1;
    cust_listadapter custom_adapter;
    List<Integer> l_items;
    List<State_Refresh> check_state;
    State_Refresh ob_state;

    Boolean b_check[]=new Boolean[50];
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        l_items=new ArrayList<Integer>();
        ob_state=new State_Refresh();
        check_state=new ArrayList<State_Refresh>();

        for(int i=1;i<=50;i++)
        {
            l_items.add(i);
            b_check[i-1]=false;
            ob_state.setState(false);
            ob_state.setButtonValue("OFF");
            check_state.add(ob_state);

        }
        l1=(ListView) findViewById(R.id.list1);

        custom_adapter=new cust_listadapter();

        l1.setAdapter(custom_adapter);


        l1.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                // TODO Auto-generated method stub
                Toast.makeText(getApplicationContext(), "huluhulu   "+arg2, 0).show();



            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    class cust_listadapter extends BaseAdapter
    {

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return l_items.size();
        }

        @Override
        public Object getItem(int arg0) {
            // TODO Auto-generated method stub
        return arg0;
        }

        @Override
        public long getItemId(int arg0) {
            // TODO Auto-generated method stub
            return arg0;
        }




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

            final View_Holder viewHolder;
            if(convertView==null)
            {

                 convertView=getLayoutInflater().inflate(R.layout.list_items,null);
             viewHolder=new View_Holder();
             viewHolder.ch1=(CheckBox) convertView.findViewById(R.id.check_box1);
             viewHolder.tv1=(TextView) 
                         convertView.findViewById(R.id.textview1);      
             viewHolder.ch1.setFocusable(false);
             viewHolder.ch1.setFocusableInTouchMode(false);         
                 convertView.setTag(viewHolder);
                 viewHolder.ch1.setTag(check_state.get(position).getState());
            }
            else
            {


                viewHolder=(View_Holder) convertView.getTag();
                viewHolder.ch1.setChecked(check_state.get(position).getState());
                //getting value from boolean array
                               // viewHolder.ch1.setChecked(b_check[position]);

            }


            viewHolder.ch1.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub  
                    if(viewHolder.ch1.isChecked())
                    {
                        check_state.get(position).setState(true);   
                        b_check[position]=true;
                                        }
                    else
                    {
                        b_check[position]=false;
                        check_state.get(position).setState(false);
                    }


                }
            });



            return convertView;
        }


    }

    class View_Holder
    {
        CheckBox ch1;
        TextView tv1;

    }

    class State_Refresh
    {
        Boolean check_value;

        public void setState(Boolean check_value)
        {
            this.check_value=check_value;
        }
        public Boolean getState()
        {
            return check_value;
        }


    }
}

1 个答案:

答案 0 :(得分:0)

将位置设置为每行的标记,在侦听器中读取它:

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

        final View_Holder viewHolder;
        if(convertView==null)
        {

             convertView=getLayoutInflater().inflate(R.layout.list_items,null);
             viewHolder=new View_Holder();
             viewHolder.ch1=(CheckBox) convertView.findViewById(R.id.check_box1);
             viewHolder.tv1=(TextView) 
                     convertView.findViewById(R.id.textview1);      
             viewHolder.ch1.setFocusable(false);
             viewHolder.ch1.setFocusableInTouchMode(false);         
             convertView.setTag(viewHolder);
             viewHolder.ch1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub  
                int pos = (Integer)v.getTag();
                check_state.get(pos).setState(((CheckBox)v).isChecked());
                b_check[pos]=((CheckBox)v).isChecked();
            }
        });

        }
        else
        {


            viewHolder=(View_Holder) convertView.getTag();
        }

        viewHolder.ch1.setTag(position);
        viewHolder.ch1.setChecked(check_state.get(position).getState());

        return convertView;
    }

顺便说一下。请不要在变量名中编码变量类型。 b_check []应该检查[]。