import
android.content.ClipData;
import
android.content.Context;
import
android.view.LayoutInflater;
import
android.view.View;
import
android.view.ViewGroup;
import
android.widget.ImageView;
import
android.widget.TextView;
import
androidx.annotation.NonNull;
import
androidx.recyclerview.widget.RecyclerView;
import
java.util.ArrayList;
import
java.util.List;
public
class
ExpandableListAdapter
extends
RecyclerView.Adapter<RecyclerView.ViewHolder> {
public
static
final
int
HEADER =
0
;
public
static
final
int
CHILD =
1
;
private
List<ClipData.Item> data;
public
ExpandableListAdapter(List<ClipData.Item> data){
this
.data = data;
}
@Override
public
RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,
int
type) {
View view =
null
;
Context context = parent.getContext();
float
dp = context.getResources().getDisplayMetrics().density;
int
subItemPaddingLeft = (
int
) (
18
* dp);
int
subItemPaddingTopAndBottom = (
int
) (
5
* dp);
switch
(type) {
case
HEADER:
LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.list_header, parent,
false
);
ListHeaderViewHolder header =
new
ListHeaderViewHolder(view);
return
header;
case
CHILD:
TextView itemTextView =
new
TextView(context);
itemTextView.setPadding(subItemPaddingLeft, subItemPaddingTopAndBottom,
0
, subItemPaddingTopAndBottom);
itemTextView.setTextColor(
0x88000000
);
itemTextView.setLayoutParams(
new
ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
return
new
RecyclerView.ViewHolder(itemTextView) {
@Override
public
String toString() {
return
super
.toString();
}
};
}
return
null
;
}
public
void
onBindViewHolder(RecyclerView.ViewHolder holder,
int
position) {
final
ClipData.Item item = data.get(position);
switch
(item.type) {
case
HEADER:
final
ListHeaderViewHolder itemController = (ListHeaderViewHolder) holder;
itemController.refferalItem = item;
itemController.header_title.setText(item.text);
if
(item.invisibleChildren ==
null
) {
itemController.btn_expand_toggle.setImageResource(R.drawable.circle_minus);
}
else
{
itemController.btn_expand_toggle.setImageResource(R.drawable.circle_plus);
}
itemController.btn_expand_toggle.setOnClickListener(
new
View.OnClickListener() {
@Override
public
void
onClick(View v) {
if
(item.invisibleChildren ==
null
) {
item.invisibleChildren =
new
ArrayList<ClipData.Item>();
int
count =
0
;
int
pos = data.indexOf(itemController.refferalItem);
while
(data.size() > pos +
1
&& data.get(pos +
1
).type == CHILD) {
item.invisibleChildren.add(data.remove(pos +
1
));
count++;
}
notifyItemRangeRemoved(pos +
1
, count);
itemController.btn_expand_toggle.setImageResource(R.drawable.circle_plus);
}
else
{
int
pos = data.indexOf(itemController.refferalItem);
int
index = pos +
1
;
for
(ClipData.Item i : item.invisibleChildren) {
data.add(index, i);
index++;
}
notifyItemRangeInserted(pos +
1
, index - pos -
1
);
itemController.btn_expand_toggle.setImageResource(R.drawable.circle_minus);
item.invisibleChildren =
null
;
}
}
});
break
;
case
CHILD:
TextView itemTextView = (TextView) holder.itemView;
itemTextView.setText(data.get(position).text);
break
;
}
}
@Override
public
int
getItemCount() {
return
data.size();
}
public
static
class
ListHeaderViewHolder
extends
RecyclerView.ViewHolder{
public
TextView header_title;
public
ImageView btn_expand_toggle;
public
ClipData.Item refferalItem;
public
ListHeaderViewHolder(
@NonNull
View itemView) {
super
(itemView);
header_title = (TextView) itemView.findViewById(R.id.header_title);
btn_expand_toggle = (ImageView) itemView.findViewById(R.id.btn_expand_toggle);
}
}
public
class
ClipDataItem {
public
int
type;
public
String text;
public
List<ClipData.Item> invisibleChildren;
private
boolean
expanded =
false
;
public
boolean
isExpanded(){
return
this
.expanded;
}
public
ClipDataItem(
int
type, String text){
this
.type = type;
this
.text = text;
}
public
int
getType(){
return
type;
}
public
String getText(){
return
text;
}
}
}