This is my actual Activity :
In this Activity I set All the ListView(s) dynamically and programmatically. As you can see, the problem I have is The 1st ListView takes the place she needs and the second ListView try to keep showing by internally adding a scroll bar..
I just wanted to know how can I say programmatically to let all the ListView(s) take the entire place she needs and just add a ScrollBar to all the activity (To Scroll the Menu for example)?
Here is my Activity and my Adapter :
public class SousBoissonsActivity extends Activity {
private String nom_categorie;
private ArrayList<String> arraySousCategoriesName;
private ArrayList<ArrayList<Drink>> arraySousCategories;
private ArrayList<MyAdapter> myAdapters;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sousboissons_list_item);
nom_categorie = getIntent().getStringExtra("nom_categorie");
setTitle(nom_categorie);
DrinksContainer.setSousCategoriesNameArray(nom_categorie);
DrinksContainer.setSousCategoriesArray(nom_categorie);
arraySousCategories = DrinksContainer.sousCategoriesArray;
myAdapters = new ArrayList<MyAdapter>();
new DoDirtyJobAsyncTask().execute();
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}
private class DoDirtyJobAsyncTask extends AsyncTask<Void, MyAdapter, Void> {
@Override
protected Void doInBackground(Void... params) {
for (ArrayList<Drink> arrayElement : arraySousCategories) {
MyAdapter myAdapter = new MyAdapter(getApplicationContext(),
arrayElement);
myAdapters.add(myAdapter);
publishProgress(myAdapter);
}
return null;
}
@Override
protected void onProgressUpdate(MyAdapter... myAdapters) {
int currViewId = 1;
LinearLayout ll = (LinearLayout) findViewById(R.id.sousboissons_linearlayout);
for (MyAdapter myAdapter : myAdapters) {
TextView sousCategorieTitle = new TextView(
getApplicationContext(), null);
sousCategorieTitle.setText(myAdapter.sousCategory);
sousCategorieTitle.setBackgroundColor(getResources().getColor(
R.color.green));
sousCategorieTitle.setTextSize(19);
sousCategorieTitle.setTextColor(getResources().getColor(
R.color.white));
sousCategorieTitle.setGravity(Gravity.CENTER);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(0, 0, 0, 0);
sousCategorieTitle.setLayoutParams(layoutParams);
ListView listview = new ListView(getApplicationContext(), null);
listview.setId(currViewId);
listview.setAdapter(myAdapter);
LinearLayout.LayoutParams layoutParams2 = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.FILL_PARENT);
layoutParams2.setMargins(17, 0, 17, 0);
listview.setLayoutParams(layoutParams2);
ll.setPadding(15, 15, 15, 0);
ll.addView(sousCategorieTitle);
ll.addView(listview);
currViewId++;
}
}
}
class MyAdapter extends ArrayAdapter<Drink> {
LayoutInflater inflat;
private ArrayList<Drink> items;
private String sousCategory;
public MyAdapter(Context context, ArrayList<Drink> objects) {
super(
context,
R.layout.activity_sousboissons_list_item_elementsouscategorie,
objects);
this.items = objects;
this.inflat = LayoutInflater.from(context);
this.sousCategory = objects.get(0).getType();
}
private class ViewHolder {
public TextView title;
public TextView prix;
public TextView desc;
public TextView size;
public ImageView img;
public LinearLayout ll;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
String currentKey = "";
String keyDialog = "";
ViewHolder holder = null;
Drink element = items.get(position);
// Instantiate Labels and Design
if (convertView == null) {
holder = new ViewHolder();
convertView = inflat
.inflate(
R.layout.activity_sousboissons_list_item_elementsouscategorie,
null);
holder.title = (TextView) convertView
.findViewById(R.id.sousboissons_element_title);
holder.desc = (TextView) convertView
.findViewById(R.id.sousboissons_element_desc);
holder.prix = (TextView) convertView
.findViewById(R.id.sousboissons_element_prix);
holder.size = (TextView) convertView
.findViewById(R.id.sousboissons_element_size);
if (element.getPrice().size() > 1) {
holder.ll = (LinearLayout) convertView
.findViewById(R.id.sousboissons_element_firt_layout);
holder.img = new ImageView(getApplicationContext(), null);
LinearLayout.LayoutParams layoutParams1 = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams1.weight = 12;
holder.title.setLayoutParams(layoutParams1);
LinearLayout.LayoutParams layoutParams2 = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams2.gravity = Gravity.RIGHT;
layoutParams2.weight = 1;
holder.img.setLayoutParams(layoutParams2);
holder.img.setImageResource(R.drawable.arrow);
holder.img.setPadding(0, 15, 0, 4);
// Alert Dialog
final LinearLayout alertDialogLayout = new LinearLayout(
SousBoissonsActivity.this);
ArrayList<Dictionary> dico = element.getPrice();
ListView liste = new ListView(SousBoissonsActivity.this);
MyAdapterDialog adapt = new MyAdapterDialog(
SousBoissonsActivity.this, element.getPrice());
liste.setAdapter(adapt);
alertDialogLayout.addView(liste);
final AlertDialog.Builder alert = new AlertDialog.Builder(
SousBoissonsActivity.this);
alert.setTitle(element.getName());
alert.setCancelable(true);
alert.setPositiveButton("Retour",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int id) {
dialog.dismiss();
}
});
alert.setView(alertDialogLayout);
holder.img.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (alertDialogLayout.getParent() != null)
((ViewGroup) alertDialogLayout.getParent())
.removeView(alertDialogLayout);
alert.show();
}
});
holder.ll.addView(holder.img);
} else {
}
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
// Setting Data on Labels
if (element != null) {
holder.title.setText(element.getName());
holder.desc.setText(element.getDescription());
if (element.getPrice().size() > 1) {
holder.prix.setVisibility(View.GONE);
holder.size.setVisibility(View.GONE);
} else {
Dictionary dico = element.getPrice().get(0);
Enumeration e = dico.keys();
while (e.hasMoreElements()) {
currentKey = (String) e.nextElement();
}
if (currentKey.equalsIgnoreCase("0")) {
holder.size.setVisibility(View.GONE);
holder.prix
.setText((String) dico.get(currentKey) + "€");
} else {
holder.prix
.setText((String) dico.get(currentKey) + "€");
holder.size.setText(currentKey + "cl");
}
}
}
return convertView;
}
}
You should not nest
ListViews
inside aScrollView
, Android won't know which to scroll. Maybe... you will be able to set programatically the fixed height for eachListView
, and then it will work.What I would recommend is either to use a single
ListView
, and group in that list all the data, or to use anExpandableListView
.Generally its a bad practice to add the
ListView
insideScrollView
. If you put yourListView or any scrollable View inside the
ScrollViewit won't work properly because when you touch the screen ,main focus of your touch is on parent view(
ScrollView) not the child View (
ListView`).Still if you want to implement it then below is the way you can try out, which is to add the
FooterView
orHeaderView
in yourListView
.Add views that should be above
ListView
as a header:and that below as a footer:
Put everything what should be above
ListView
toHeader
ofListView
and the same with footer to add below.In result you'll get one scrollable view.