简体   繁体   中英

How avoid refresh checkbox while expand list in android

I'm making NLevel expandable list using listview. I've added checkbox only last level data in list view. I have stuck in below scenario.

If I check checkbox then when I expand listview means checkbox gets automatically unchecked.I don't want it to be like that. If I checked checkbox it should stay checked until I uncheck manually.

Please anyone help me!! It's been two days I stuck here.

Here goes my code:

MainActivity.java

public class MainActivity extends Activity {

    List<NLevelItem> list;
    ListView listView;
    Context context;
    Button checkButton;
    ArrayList<String>tempList;

    CheckBox selected = null; //Make only one selection at a time
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (ListView) findViewById(R.id.listView1);
        list = new ArrayList<NLevelItem>();
        context = this;
        checkButton = (Button)findViewById(R.id.buttons);
        tempList = new ArrayList<String>();
        //here we create 5 grandparent (top level) NLevelItems
        //then foreach grandparent create a random number of parent (second level) NLevelItems
        //then foreach parent create a random number of children (third level) NLevelItems

        //we pass in an anonymous instance of NLevelView to the NLevelItem, this NLevelView is
        //what supplies the NLevelAdapter with a View for this NLevelItem
        Random rng = new Random();
        final LayoutInflater inflater = LayoutInflater.from(this);
        for (int i = 0; i < 5; i++) {
            final NLevelItem grandParent = new NLevelItem(new SomeObject("GrandParent "+i),null, new NLevelView() {

                @Override
                public View getView(NLevelItem item) {
                    View view = inflater.inflate(R.layout.list_item, null);
                    TextView tv = (TextView) view.findViewById(R.id.textView);
                    //tv.setBackgroundColor(Color.GREEN);
                    String name = (String) ((SomeObject) item.getWrappedObject()).getName();
                    tv.setText(name);
                    return view;
                }
            });
            list.add(grandParent);

            int numChildren = rng.nextInt(4) + 1;
            for (int j = 0; j < numChildren; j++) {
                NLevelItem parent = new NLevelItem(new SomeObject("Parent "+j),grandParent, new NLevelView() {

                    @Override
                    public View getView(NLevelItem item) {
                        View view = inflater.inflate(R.layout.list_item, null);
                        TextView tv = (TextView) view.findViewById(R.id.textView);
                        //tv.setBackgroundColor(Color.YELLOW);
                        String name = (String) ((SomeObject) item.getWrappedObject()).getName();
                        tv.setText(name);
                        return view;
                    }
                });
                list.add(parent);

                int children = rng.nextInt(3)+1;
                for(int x=0; x<children;x++){
                    final NLevelItem childs = new NLevelItem(new SomeObject("Parent1 "+x),parent, new NLevelView() {

                        @Override
                        public View getView(NLevelItem item) {
                            View view = inflater.inflate(R.layout.list_item, null);
                            TextView tv = (TextView) view.findViewById(R.id.textView);
                            //tv.setBackgroundColor(Color.BLUE);
                            String name = (String) ((SomeObject) item.getWrappedObject()).getName();
                            tv.setText(name);
                            return view;
                        }
                    });
                    list.add(childs);

                    int grandChildren = rng.nextInt(5)+1;
                    for( int k = 0; k < grandChildren; k++) {
                        NLevelItem child = new NLevelItem(new SomeObject("child "+k),childs, new NLevelView() {

                            @Override
                            public View getView(NLevelItem item) {
                                View view = inflater.inflate(R.layout.check_list, null);
                                TextView tv = (TextView) view.findViewById(R.id.checktextView);
                                final String name = (String) ((SomeObject) item.getWrappedObject()).getName();
                                final CheckBox checkBox = (CheckBox)view.findViewById(R.id.check);
                                checkBox.setOnClickListener(new View.OnClickListener() {
                                    @Override
                                    public void onClick(View v) {
                                        if(selected != null){  //Edit
                                             selected.setChecked(false);
                                            }
                                            selected = checkBox; //Edit
                                        if(checkBox.isChecked()){

                                            tempList.add((String) ((SomeObject)childs.getWrappedObject()).getName()+"+"+name);
                                        }
                                        else {
                                            tempList.remove((String) ((SomeObject)childs.getWrappedObject()).getName()+"+"+name);
                                        }
                                    }
                                });
                                //tv.setBackgroundColor(Color.GRAY);

                                tv.setText(name);
                                return view;
                            }
                        });
                        list.add(child);
                    }
                }

            }
        }

        NLevelAdapter adapter = new NLevelAdapter(list);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                ((NLevelAdapter)listView.getAdapter()).toggle(arg2);
                ((NLevelAdapter)listView.getAdapter()).getFilter().filter();

            }
        });

        checkButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                for (int i=0;i<tempList.size();i++){
                    Toast.makeText(context,tempList.get(i),Toast.LENGTH_LONG).show();
                }
            }
        });


    }   

    class SomeObject {
        public String name;

        public SomeObject(String name) {
            this.name = name;
        }
        public String getName() {
            return name;
        }
    }

}

NLevelAdapter.java

public class NLevelAdapter extends BaseAdapter {

        List<NLevelItem> list;
        List<NLevelListItem> filtered;
        public void setFiltered(ArrayList<NLevelListItem> filtered) {
                this.filtered = filtered;

        }

        public NLevelAdapter(List<NLevelItem> list) {
                this.list = list;
                this.filtered = filterItems();
        }

        @Override
        public int getCount() {
                return filtered.size();
        }

        @Override
        public NLevelListItem getItem(int arg0) {
                return filtered.get(arg0);
        }

        @Override
        public long getItemId(int arg0) {
                return 0;
        }

        @Override
        public View getView(int arg0, View arg1, ViewGroup arg2) {
                return getItem(arg0).getView();
        }

        public NLevelFilter getFilter() {
                return new NLevelFilter();
        }


        class NLevelFilter {

                public void filter() {
                        new AsyncFilter().execute();
                }

                class AsyncFilter extends AsyncTask<Void, Void, ArrayList<NLevelListItem> > {

                        @Override
                        protected ArrayList<NLevelListItem> doInBackground(Void...arg0) {
                                return (ArrayList<NLevelListItem>)filterItems();
                        }

                        @Override
                        protected void onPostExecute(ArrayList<NLevelListItem> result) {
                                setFiltered(result);
                                NLevelAdapter.this.notifyDataSetChanged();
                        }
                }


        }

        public List<NLevelListItem> filterItems() {

            List<NLevelListItem> tempfiltered = new ArrayList<NLevelListItem>();
            OUTER: for (NLevelListItem item : list) {
                        //add expanded items and top level items
                        //if parent is null then its a top level item
                        if(item.getParent() == null) {
                                tempfiltered.add(item);
                        } else {
                                //go through each ancestor to make sure they are all expanded
                                NLevelListItem parent = item;
                                while ((parent = parent.getParent())!= null) {
                                        if (!parent.isExpanded()) {
                                                    //one parent was not expanded
                                                    //skip the rest and continue the OUTER for loop
                                                    continue OUTER;
                                        }
                                }
                                tempfiltered.add(item);
                      }
                }

                return tempfiltered;    
        }

        public void toggle(int arg2) {
                    filtered.get(arg2).toggle();
        }
}

Thanks in advance!!

Use ViewHolder class to set and get Tag like this:

public class ListAdapter extends BaseAdapter {

    private Context con;
    private List<String> dataLt;
    private static LayoutInflater inflater = null;

    public ListAdapter(Context context, List<String> dataList){
        con         = context;
        dataLt      = dataList;
        inflater    = (LayoutInflater)con.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return dataLt.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View vi = convertView;
        ViewHolder holder;

        if(convertView==null){

            /****** Inflate tabitem.xml file for each row ( Defined below ) *******/
            vi = inflater.inflate(R.layout.list_item_search, null);
            /****** View Holder Object to contain tabitem.xml file elements ******/
            holder = new ViewHolder();
            holder.textView           = (TextView)    vi.findViewById(R.id.textView);
            /************  Set holder with LayoutInflater ************/
            vi.setTag( holder );
        }
        else
            holder=(ViewHolder)vi.getTag();

        return vi;
    }

    public static class ViewHolder{
        TextView textView;
    }
}

Hope this may help.

i think you need to store the checkbox state in a boolean (is checked), and reflect that on the view, when getView() is called.

1- Add boolean checked to NLevelItem :

private boolean checked = false;
//add setter: setChecked(boolean)
//add getter isChecked()

2- Use that boolean in getView() (last one where checkbox is added)

@Override
public View getView(final NLevelItem item) {
// .......

    final CheckBox checkBox = (CheckBox)view.findViewById(R.id.check);
    checkBox.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            //store checkbox state, note that NLevelItem item might need to be defined with 'final'
            item.setChecked(checkBox.isChecked());

            if(checkBox.isChecked()){
                tempList.add((String) ((SomeObject)childs.getWrappedObject()).getName()+"+"+name);
            }
            else {
                tempList.remove((String) ((SomeObject)childs.getWrappedObject()).getName()+"+"+name);
            }
        }//onClick()
    }//setOnClickListener()

    //update checkbox state from the corresponding NLevelItem
    checkBox.setChecked(item.isChecked());

    //.......
}//getView()

-EDIT:

to select 1 item, you need to iterate all items, set checked = false, but 1 i am not sure if you have to do it on:

List<NLevelItem> list;

or

List<NLevelListItem> filtered;

in the adapter class

private void selectOnly(int position){
    for(int a=0;a<list.size();a++){
        if(a == position){
            list.get(a).setChecked(true);
            continue;
        }
        list.get(a).setChecked(false);
    }//for loop
    notifyDataSetChanged(); // to update views (checkbox state)
}

Usage: selectOnly(15);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM