这是我的实际活动:
在这个活动我设置的所有的ListView(S)和动态编程。 正如你所看到的,这个问题我已经是第1 ListView控件需要她需要的地方 第二ListView中尽量保持显示通过在内部增加一个滚动条。
我只是想知道我怎么能说编程,让所有的ListView(S)取 整座她需要,只是一个滚动条添加到所有的活动(可以滚动菜单为例)?
下面是我的活动,我的适配器:
公共类SousBoissonsActivity延伸活动{
私人字符串nom_categorie;
私人的ArrayList<字符串> arraySousCategoriesName;
私人的ArrayList< ArrayList的<饮料>> arraySousCategories;
私人的ArrayList< MyAdapter> myAdapters;
@覆盖
保护无效的onCreate(包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 =新的ArrayList< MyAdapter>();
新DoDirtyJobAsyncTask()执行()。
}
@覆盖
保护无效onResume(){
super.onResume();
}
@覆盖
保护无效的onDestroy(){
super.onDestroy();
}
@覆盖
公共布尔onOptionsItemSelected(菜单项项){
返回super.onOptionsItemSelected(项目);
}
私有类DoDirtyJobAsyncTask扩展的AsyncTask<太虚,MyAdapter,太虚> {
@覆盖
保护无效doInBackground(虚空...... PARAMS){
对于(ArrayList的<饮料> arrayElement:arraySousCategories){
MyAdapter myAdapter =新MyAdapter(getApplicationContext()
arrayElement);
myAdapters.add(myAdapter);
publishProgress(myAdapter);
}
返回null;
}
@覆盖
保护无效onProgressUpdate(MyAdapter ... myAdapters){
INT currViewId = 1;
的LinearLayout LL =(的LinearLayout)findViewById(R.id.sousboissons_linearlayout);
对于(MyAdapter myAdapter:myAdapters){
TextView的sousCategorieTitle =新的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 =新LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(0,0,0,0);
sousCategorieTitle.setLayoutParams(的LayoutParams);
ListView控件列表视图=新的ListView(getApplicationContext(),NULL);
listview.setId(currViewId);
listview.setAdapter(myAdapter);
LinearLayout.LayoutParams layoutParams2 =新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(列表视图);
currViewId ++;
}
}
}
类MyAdapter扩展ArrayAdapter<饮料> {
LayoutInflater inflat;
私人的ArrayList<饮料>项目;
私人字符串sousCategory;
公共MyAdapter(上下文的背景下,ArrayList的<饮料>对象){
超(
的背景下,
R.layout.activity_sousboissons_list_item_elementsouscategorie,
对象);
this.items =物体;
this.inflat = LayoutInflater.from(上下文);
this.sousCategory = objects.get(0).getType();
}
私有类ViewHolder {
公共TextView的称号;
公众的TextView大奖赛;
公共TextView的说明;
公共TextView的大小;
公共ImageView的IMG;
公众的LinearLayout LL;
}
@覆盖
公共查看getView(INT位置,查看convertView,ViewGroup中父){
字符串currentKey =;
字符串keyDialog =;
ViewHolder支架=无效;
喝元= items.get(位置);
//实例化标签和设计
如果(convertView == NULL){
持有人=新ViewHolder();
convertView = inflat
。膨胀(
R.layout.activity_sousboissons_list_item_elementsouscategorie,
空值);
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);
如果(element.getPrice()的大小()→1){
holder.ll =(的LinearLayout)convertView
.findViewById(R.id.sousboissons_element_firt_layout);
holder.img =新ImageView的(getApplicationContext(),NULL);
LinearLayout.LayoutParams layoutParams1 =新LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams1.weight = 12;
holder.title.setLayoutParams(layoutParams1);
LinearLayout.LayoutParams layoutParams2 =新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);
//警告对话框
最后的LinearLayout alertDialogLayout =新的LinearLayout(
SousBoissonsActivity.this);
ArrayList的<字典> DICO = element.getPrice();
ListView控件清单当然=新的ListView(SousBoissonsActivity.this);
MyAdapterDialog适应=新MyAdapterDialog(
SousBoissonsActivity.this,element.getPrice());
liste.setAdapter(适应);
alertDialogLayout.addView(清单当然);
最后AlertDialog.Builder警报=新AlertDialog.Builder(
SousBoissonsActivity.this);
alert.setTitle(element.getName());
alert.setCancelable(真正的);
alert.setPositiveButton(传译,
新DialogInterface.OnClickListener(){
公共无效的onClick(DialogInterface对话框,
INT编号){
dialog.dismiss();
}
});
alert.setView(alertDialogLayout);
holder.img.setOnClickListener(新OnClickListener(){
@覆盖
公共无效的onClick(视图v){
如果(alertDialogLayout.getParent()!= NULL)
((ViewGroup中)alertDialogLayout.getParent())
.removeView(alertDialogLayout);
alert.show();
}
});
holder.ll.addView(holder.img);
} 其他 {
}
convertView.setTag(保持器);
} 其他 {
支架=(ViewHolder)convertView.getTag();
}
//在标签上设定数据
如果(元素!= NULL){
holder.title.setText(element.getName());
holder.desc.setText(element.getDescription());
如果(element.getPrice()的大小()→1){
holder.prix.setVisibility(View.GONE);
holder.size.setVisibility(View.GONE);
} 其他 {
。字典迪科= element.getPrice()得到(0);
枚举E = dico.keys();
而(e.hasMoreElements()){
currentKey =(字符串)e.nextElement();
}
如果(currentKey.equalsIgnoreCase(0)){
holder.size.setVisibility(View.GONE);
holder.prix
.setText((字符串)dico.get(currentKey)+€);
} 其他 {
holder.prix
.setText((字符串)dico.get(currentKey)+€);
holder.size.setText(currentKey +瘦肉精);
}
}
}
返回convertView;
}
}
解决方案
您不能嵌套列表视图
在滚动型
Android将不知道哪个滚动。也许......你就可以编程设定固定高度每的ListView
,然后它会工作。
我会建议要么使用单一的ListView
,并且组在该列表中的所有数据,或使用的 ExpandableListView
。
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 a ScrollView
, Android won't know which to scroll. Maybe... you will be able to set programatically the fixed height for each ListView
, 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 an ExpandableListView
.