0
I need to do a recyrcleview one inside another vertically more like this as already besieged elsewhere will not work. And the Expandable list view in my case does not meet my need because it will have several particularities.
I started using Layoutinflater and I was able to do that I wanted the dynamic internal part plus the external part of it I only get it manually and I needed to do it dynamically because as it will be generated with data that will come from the database I do not know if it will have 1 or a thousand headers with data inside, And in my code, it’s only for two, and if I needed more, I’d have to do it manually. I do not know if I could be clear. I thank you in advance!
My Mainactivity.
public class MainActivity extends AppCompatActivity {
private ArrayList<Resultado> lista1 = new ArrayList<Resultado>();
private ArrayList<Resultado> lista2 = new ArrayList<Resultado>();
private RecyclerView mRecyclerView;
private RecyclerView.LayoutManager mLayoutManager;
private DynamicListAdapter mDynamicListAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = (RecyclerView) findViewById(R.id.recyrcleview);
lista1 = Utils.preencherLista1();
lista2 = Utils.preencherLista2();
mDynamicListAdapter = new DynamicListAdapter();
mLayoutManager = new LinearLayoutManager(MainActivity.this);
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(mDynamicListAdapter);
}
private class DynamicListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int ITEM_RESULTADO_VIEW1 = 1;
private static final int ITEM_RESULTADO_CABECALHO_VIEW1 = 2;
private static final int ITEM_RESULTADO_VIEW2 = 3;
private static final int ITEM_RESULTADO_CABECALHO_VIEW2 = 4;
public DynamicListAdapter() {
}
public class ViewHolder extends RecyclerView.ViewHolder {
private TextView txtDescricao;
private TextView txtTitulo;
public ViewHolder(final View itemView) {
super(itemView);
txtDescricao = (TextView) itemView.findViewById(R.id.descricao);
txtTitulo = (TextView) itemView.findViewById(R.id.titulo);
}
public void bindViewSecondList(int pos) {
if (lista1 == null) pos = pos - 1;
else {
if (lista1.size() == 0) pos = pos - 1;
else pos = pos - lista1.size() - 2;
}
final String descricao = lista2.get(pos).getDescricao();
final String titulo = lista2.get(pos).getTitulo();
txtDescricao.setText(descricao);
txtTitulo.setText(titulo);
}
public void bindViewFirstList(int pos) {
pos = pos - 1;
final String descricao = lista1.get(pos).getDescricao();
final String titulo = lista1.get(pos).getTitulo();
txtDescricao.setText(descricao);
txtTitulo.setText(titulo);
}
}
private class ItemCabecalhoLista1ViewHolder extends ViewHolder {
public ItemCabecalhoLista1ViewHolder(View itemView) {
super(itemView);
}
}
private class ItemLista1ViewHolder extends ViewHolder {
public ItemLista1ViewHolder(View itemView) {
super(itemView);
}
}
private class ItemCabecalhoLista2ViewHolder extends ViewHolder {
public ItemCabecalhoLista2ViewHolder(View itemView) {
super(itemView);
}
}
private class ItemLista2ViewHolder extends ViewHolder {
public ItemLista2ViewHolder(View itemView) {
super(itemView);
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v;
if (viewType == ITEM_RESULTADO_VIEW1) {
v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_resultado, parent, false);
ItemLista1ViewHolder vh = new ItemLista1ViewHolder(v);
return vh;
} else if (viewType == ITEM_RESULTADO_CABECALHO_VIEW1) {
v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_resultado_cabecalho, parent, false);
ItemCabecalhoLista1ViewHolder vh = new ItemCabecalhoLista1ViewHolder(v);
return vh;
} else if (viewType == ITEM_RESULTADO_CABECALHO_VIEW2) {
v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_resultado_cabecalho, parent, false);
ItemCabecalhoLista2ViewHolder vh = new ItemCabecalhoLista2ViewHolder(v);
return vh;
} else {
v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_resultado, parent, false);
ItemLista2ViewHolder vh = new ItemLista2ViewHolder(v);
return vh;
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
try {
if (holder instanceof ItemLista2ViewHolder) {
ItemLista2ViewHolder vh = (ItemLista2ViewHolder) holder;
vh.bindViewSecondList(position);
} else if (holder instanceof ItemCabecalhoLista1ViewHolder) {
ItemCabecalhoLista1ViewHolder vh = (ItemCabecalhoLista1ViewHolder) holder;
} else if (holder instanceof ItemLista1ViewHolder) {
ItemLista1ViewHolder vh = (ItemLista1ViewHolder) holder;
vh.bindViewFirstList(position);
} else if (holder instanceof ItemCabecalhoLista2ViewHolder) {
ItemCabecalhoLista2ViewHolder vh = (ItemCabecalhoLista2ViewHolder) holder;
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public int getItemCount() {
int tamanhoLista1 = 0;
int tamanhoLista2 = 0;
if (lista2 == null && lista1 == null) return 0;
if (lista2 != null)
tamanhoLista2 = lista2.size();
if (lista1 != null)
tamanhoLista1 = lista1.size();
if (tamanhoLista2 > 0 && tamanhoLista1 > 0)
return 1 + tamanhoLista1 + 1 + tamanhoLista2 + 1;
else if (tamanhoLista2 > 0 && tamanhoLista1 == 0)
return 1 + tamanhoLista2 + 1;
else if (tamanhoLista2 == 0 && tamanhoLista1 > 0)
return 1 + tamanhoLista1;
else return 0;
}
@Override
public int getItemViewType(int position) {
int tamanhoLista1 = 0;
int tamanhoLista2 = 0;
if (lista2 == null && lista1 == null)
return super.getItemViewType(position);
if (lista2 != null)
tamanhoLista2 = lista2.size();
if (lista1 != null)
tamanhoLista1 = lista1.size();
if (tamanhoLista2 > 0 && tamanhoLista1 > 0) {
if (position == 0) return ITEM_RESULTADO_CABECALHO_VIEW1;
else if (position == tamanhoLista1 + 1)
return ITEM_RESULTADO_CABECALHO_VIEW2;
else if (position > tamanhoLista1 + 1)
return ITEM_RESULTADO_VIEW2;
else return ITEM_RESULTADO_VIEW1;
} else if (tamanhoLista2 > 0 && tamanhoLista1 == 0) {
if (position == 0) return ITEM_RESULTADO_CABECALHO_VIEW2;
else return ITEM_RESULTADO_VIEW1;
} else if (tamanhoLista2 == 0 && tamanhoLista1 > 0) {
if (position == 0) return ITEM_RESULTADO_CABECALHO_VIEW1;
else return ITEM_RESULTADO_VIEW1;
}
return super.getItemViewType(position);
}
}
Model
public class Resultado {
private String titulo;
private String descricao;
public Resultado(String titulo, String descricao) {
this.setTitulo(titulo);
this.setDescricao(descricao);
}
public String getTitulo() {
return titulo;
}
public void setTitulo(String titulo) {
this.titulo = titulo;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
And the class I use to fill
public class Utils {
public static ArrayList<Resultado> preencherLista1() {
ArrayList<Resultado> mFirstList = new ArrayList<Resultado>();
for (int i = 0; i < 10; i++) {
Resultado mResultado = new Resultado(" " + i, "Descricão " + i);
mFirstList.add(mResultado);
}
return mFirstList;
}
public static ArrayList<Resultado> preencherLista2() {
ArrayList<Resultado> mSecondList = new ArrayList<Resultado>();
for (int i = 0; i < 3; i++) {
Resultado mResultado = new Resultado(" " + i, "Descricão " + i);
mSecondList.add(mResultado);
}
return mSecondList;
}
Main view
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="inovace.masudias.com.dynamicrecyclerview.MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyrcleview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Item
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="5px"
android:orientation="horizontal">
<TextView
android:id="@+id/titulo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/holo_red_dark" />
<TextView
android:id="@+id/descricao"
android:paddingLeft="10px"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/holo_green_dark" />
header item
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="Cabeçalho "
android:textSize="16sp"
android:textStyle="bold|italic" />
You can do this with Expandable recyclerview. The part that will expand is dynamic.
– Max Fratane
I don’t know if I was clear with what I want more if Expandable recyclerview has the option to leave all expanded without the user clicking to open would solve my problem
– user70879