0

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

1.I want to check checkbox only one item at a time

2.If I expand listview means checkbox gets automatically unchecked.I don't want it to be like that. Last checked checkbox it should stay checked until I uncheck manually or checked other item.

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; //check only one item at a time
String names ="";
@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++) {
                    final NLevelItem child = new NLevelItem(new SomeObject("child "+k),childs, new NLevelView() {
                        @Override
                        public View getView(final 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) {
                                    //store checkbox state, note that NLevelItem item might need to be defined with 'final'
                                    item.setChecked(checkBox.isChecked());
                                    if(selected != null){  //check only one item at a time
                                        selected.setChecked(false);
                                    }
                                    selected = checkBox;
                                    //item.setChecked(checkBox.isChecked());
                                }
                            });
                            //update checkbox state from the corresponding NLevelItem
                            checkBox.setChecked(item.isChecked());
                            //Log.d("Itemss",((SomeObject) item.getWrappedObject()).getName());
                            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,names,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();
  }
}

NLevelItem.java

public class NLevelItem implements NLevelListItem {

private Object wrappedObject;
private NLevelItem parent;
private NLevelView nLevelView;
private boolean isExpanded = false;
private boolean checked = false;

public NLevelItem(Object wrappedObject, NLevelItem parent, NLevelView nLevelView) {
    this.wrappedObject = wrappedObject;
    this.parent = parent;
    this.nLevelView = nLevelView;
}

public boolean isChecked() {
    return checked;
}

public void setChecked(boolean checked) {
    this.checked = checked;
}

public Object getWrappedObject() {
    return wrappedObject;
}

@Override
public boolean isExpanded() {
    return isExpanded;
}
@Override
public NLevelListItem getParent() {
    return parent;
}
@Override
public View getView() {
    return nLevelView.getView(this);
}
@Override
public void toggle() {
    isExpanded = !isExpanded;
}

}

Thanks in advance!!

appu
  • 143
  • 2
  • 3
  • 15
  • Please don't repeat questions. Simply editing your original post with any new information you have, any new code you've tried, or an explanation of why any posted answers aren't working will bump it to the top of the active queue. – Mike M. Apr 06 '17 at 06:43
  • @MikeM. I added new scenario with existing question – appu Apr 06 '17 at 06:52
  • You're still trying to accomplish the same thing. If you've updated your code, then update your original question, along with the description of your current issues. – Mike M. Apr 06 '17 at 06:58
  • Original question - "I want to check only one checkbox at a time." This question - "I want to check checkbox only one item at a time" Are you saying that if you get a working answer to this question, you still need a separate, distinct answer to the original one? – Mike M. Apr 06 '17 at 07:05

0 Answers0