mardi 17 janvier 2017

Android expandable multi list view with checkbox selecting the random value?

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