i am new to expandable multi list view.I tried to make 3 level expandable list view , it is working successfully,i am using recycler view inside the expandable parent group view as well as i am using multi selection check boxes for selecting multiple items.
Right now when i click on the "0 index"child view check box, randomly other check box is selecting, the behaviour of check boxes are not proper.I am using below code, please suggest me where i am doing wrong.
Answer will be appreciated , Thanks in advance!!
ProfessionalFilterExpListAdapter.Java
public class ProfessionalFilterExpListAdapter < T extends BaseActivity & FilterSelectionListener > extends BaseExpandableListAdapter {
private T callback;
private HashMap< Integer, boolean[] > mChildCheckStates;
private List< FilterItems > items;
private HashMap< String, String > selectedItems;
private ArrayList<Integer> expandedItems;
public ProfessionalFilterExpListAdapter( T callback, List< FilterItems > expListValue ) {
this.callback = callback;
items = expListValue;
mChildCheckStates = new HashMap<>();
selectedItems = new HashMap<>();
expandedItems=new ArrayList<>( );
}
@Override
public int getGroupCount() {
return items.size();
}
@Override
public int getChildrenCount( int groupPosition ) {
if ( items.get( groupPosition ).getOptions() != null ) {
return items.get( groupPosition ).getOptions().size();
}
else {
return 0;//No child
}
}
@Override
public FilterItems getGroup( int groupPosition ) {
return items.get( groupPosition );
}
@Override
public FilterItemOption getChild( int groupPosition, int childPosition ) {
return items.get( groupPosition ).getOptions().get( childPosition );
}
@Override
public long getGroupId( int groupPosition ) {
return groupPosition;
}
@Override
public long getChildId( int groupPosition, int childPosition ) {
return childPosition;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public View getGroupView( final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent ) {
GroupViewHolder groupViewHolder;
if ( convertView == null ) {
LayoutInflater inflater = ( LayoutInflater ) callback
.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
convertView = inflater.inflate( R.layout.item_filter_group_title, null );
groupViewHolder = new GroupViewHolder( convertView );
convertView.setTag( groupViewHolder );
}
groupViewHolder = ( GroupViewHolder ) convertView.getTag();
groupViewHolder.mGroupText.setText( items.get( groupPosition ).getTitle() );
groupViewHolder.mChildItemText.setText( items.get( groupPosition ).getDefaultValue() );
return convertView;
}
@Override
public View getChildView( final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent ) {
final FilterItemOption filterItemOption = getChild( groupPosition, childPosition );
final ChildViewHolder childViewHolder;
if ( convertView == null ) {
LayoutInflater inflater = ( LayoutInflater ) callback
.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
convertView = inflater.inflate( R.layout.item_filter_child_group, null );
childViewHolder = new ChildViewHolder( convertView );
childViewHolder.filterSubGroupView.setAdapter( new FilterSubGroupAdapter( callback,filterItemOption.getSubItems() ));
convertView.setTag( childViewHolder );
}else{
childViewHolder = ( ChildViewHolder ) convertView.getTag( );
}
if(filterItemOption.isExpanded()){
childViewHolder.filterSubGroupView.recyclerView.setVisibility( View.VISIBLE );
}else{
childViewHolder.filterSubGroupView.recyclerView.setVisibility( View.GONE );
}
childViewHolder.filterSubGroupView.setTitle( filterItemOption.getName() );
childViewHolder.filterSubGroupView.setListener( new FilterSubGroupView.OnItemSelectionListener() {
@Override
public void onItemSelected( ProfessionalFilter professionalFilter, boolean isChecked ) {
filterItemOption.setExpanded( isChecked );
items.get( groupPosition ).setDefaultValues( professionalFilter.getChildName() );
notifyDataSetChanged();
}
} );
return convertView;
}
public HashMap< String, String > getSelectedItems() {
return selectedItems;
}
public void clearChildFields() {
items.get( 0 ).setDefaultValues( " " );
items.get( 1 ).setDefaultValues( " " );
items.get( 2 ).setDefaultValues( " " );
}
@Override
public boolean isChildSelectable( int groupPosition, int childPosition ) {
return false;
}
private static final class GroupViewHolder {
TextView mGroupText, mChildItemText;
public GroupViewHolder( View rootView ) {
this.mGroupText = ( TextView ) rootView.findViewById( R.id.textGroupListTitle );
this.mChildItemText = ( TextView ) rootView.findViewById( R.id.textListChildItemSelected );
}
}
private static final class ChildViewHolder {
FilterSubGroupView filterSubGroupView;
public ChildViewHolder( View rootView ) {
filterSubGroupView = ( FilterSubGroupView ) rootView.findViewById( R.id.filterSubGroupView );
}
}
}
Here is sub group view class :
FilterSubGroupView.java
public class FilterSubGroupView extends FrameLayout {
private RobotoTextView txtProfessionalSubTitle;
public RecyclerView recyclerView;
private FilterSubGroupAdapter profSubGroupAdapter;
private OnItemSelectionListener listener;
public FilterSubGroupView( Context context ) {
super( context );
init( context );
}
public FilterSubGroupView( Context context, AttributeSet attrs ) {
super( context, attrs );
init( context );
}
public FilterSubGroupView( Context context, AttributeSet attrs, int defStyleAttr ) {
super( context, attrs, defStyleAttr );
init( context );
}
@RequiresApi( api = Build.VERSION_CODES.LOLLIPOP )
public FilterSubGroupView( Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes ) {
super( context, attrs, defStyleAttr, defStyleRes );
init( context );
}
private void init( Context context ) {
LayoutInflater inflater = ( LayoutInflater ) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
View rootView = inflater.inflate( R.layout.item_filter_sub_group, this, true );
txtProfessionalSubTitle = ( RobotoTextView ) rootView.findViewById( R.id.txtProfessionalSubTitle );
recyclerView = ( RecyclerView ) rootView.findViewById( R.id.valueRecyclerView );
recyclerView.setVisibility( View.GONE );
LinearLayoutManager verticalLayoutmanager
= new LinearLayoutManager( context, LinearLayoutManager.VERTICAL, false );
recyclerView.setLayoutManager( verticalLayoutmanager );
txtProfessionalSubTitle.setOnClickListener( new OnClickListener() {
@Override
public void onClick( View v ) {
if ( recyclerView.getVisibility() == View.VISIBLE ) {
recyclerView.setVisibility( View.GONE );
}
else {
recyclerView.setVisibility( View.VISIBLE );
}
}
} );
}
public void setAdapter( FilterSubGroupAdapter profSubGroupAdapter ) {
this.profSubGroupAdapter=profSubGroupAdapter;
recyclerView.setAdapter( profSubGroupAdapter );
}
public RobotoTextView getTxtProfessionalSubTitle() {
return txtProfessionalSubTitle;
}
public void setTitle( String subTitle ) {
this.txtProfessionalSubTitle.setText( subTitle );
}
public void setData( ArrayList< ProfessionalFilter > data) {
}
public void setListener( OnItemSelectionListener listner ) {
this.listener = listner;
profSubGroupAdapter.setListener( listner );
}
/**
* Here we will create an interface for getting child item value.
*/
public interface OnItemSelectionListener {
void onItemSelected( ProfessionalFilter professionalFilter, boolean isChecked );
}
public void notifyDataSetChanged() {
if ( profSubGroupAdapter != null && recyclerView != null && !recyclerView.isComputingLayout() ) {
profSubGroupAdapter.notifyDataSetChanged();
}
}
}
Here is FilterSubGroupAdapter class
FilterSubGroupAdapter.java
public class FilterSubGroupAdapter extends RecyclerView.Adapter< FilterSubGroupAdapter.ViewHolder > {
private Context context;
private List< ProfessionalFilter > profArrayList;
private FilterSubGroupView.OnItemSelectionListener listner;
public FilterSubGroupAdapter( Context context, List< ProfessionalFilter > profArrayList ) {
this.context = context;
this.profArrayList = profArrayList;
}
@Override
public FilterSubGroupAdapter.ViewHolder onCreateViewHolder( ViewGroup viewGroup, int i ) {
View view = LayoutInflater.from( viewGroup.getContext() ).inflate( R.layout.item_filter_child_title, viewGroup, false );
return new ViewHolder( view );
}
@Override
public void onBindViewHolder( final ViewHolder holder, final int position ) {
holder.chkBoxChildExpList.setText( profArrayList.get( position ).getChildName() );
holder.chkBoxChildExpList.setChecked( profArrayList.get( position ).isSelected() );
holder.chkBoxChildExpList.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick( View v ) {
profArrayList.get( position ).setSelected( holder.chkBoxChildExpList.isChecked() );
if ( listner != null) {
listner.onItemSelected( profArrayList.get( position ), holder.chkBoxChildExpList.isChecked() );
}
notifyDataSetChanged();
}
} );
}
public void setListener( FilterSubGroupView.OnItemSelectionListener listner ) {
this.listner = listner;
}
@Override
public int getItemCount() {
return profArrayList.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
final CheckBox chkBoxChildExpList;
public ViewHolder( View view ) {
super( view );
chkBoxChildExpList = ( CheckBox ) view.findViewById( R.id.chkBoxChildExpList );
}
}
}
Aucun commentaire:
Enregistrer un commentaire