Google's Mentality: Listview In Scrollview
Solution 1:
You could use a LinearLayout
as your non-scrollable ListView
. A lot of the power of ListView
is how it deals with lazy-loading of elements. This doesn't really make sense in the context of a non-scrollable version.
But really, you most likely need to rethink your UI. Why do you need multiple scrolling sections? That seems really unfriendly from a user's perspective. You can easily place things above and below a ListView
via a header or footer.
Solution 2:
Like Mayra said, you should rethink your UI.
Unless you have multiple ListViews, I can see a solution to your problem. Since you seem to have only one list view in your scroll view. That means that you wanted to put something above or below.
You there have setHeader, setFooter. There you just have to put anything you want. You have to add theses views before setAdapter().
If you have multiple ListViews in your scrollview. I have a second solution for you. I can't really elaborate. But you'd have to create a custom adapter and override ViewTypeCount so you can handle multiple types of items. That way you can load everything you want through the adapter. And all you really need is a ListView.
If you want to handle multiple types of items (multiple listviews) here is an example "untested"
You have to subclass adapter and override getView. Habitually we should have something similar to that for view recycling
if(view == null){
//inflate view
}
In your case, you'll need to do that.
package com.neutrino.lvt;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
publicclassMainextendsActivity {
private ListView lv;
/** Called when the activity is first created. */@OverridepublicvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lv = (ListView)findViewById(R.id.lv);
ArrayList<Items> items = newArrayList<Items>();
items.add(newItemA("Une"));
items.add(newItemA("Une3"));
items.add(newItemA("Une4"));
items.add(newItemA("Une5"));
items.add(newItemA("Une6"));
items.add(newItemA("Une7"));
items.add(newItemA("Une8"));
items.add(newItemA("Une9"));
items.add(newItemA("Une0"));
items.add(newItemA("Une0-"));
items.add(newItemB("bbb", "cc1c"));
items.add(newItemB("bbb3", "c2cc"));
items.add(newItemB("bbb4", "c2cc"));
items.add(newItemB("bbb5", "c1cc"));
items.add(newItemB("bbb6", "cc5c"));
items.add(newItemB("bbb7", "cc4c"));
items.add(newItemB("bbb7", "c2cc"));
items.add(newItemB("bbb8", "c1cc"));
items.add(newItemB("bbb9", "cc6c"));
items.add(newItemB("bbb0", "cc8c"));
items.add(newItemB("bbb0", "cc0c"));
items.add(newItemB("bb3b", "cc6c"));
items.add(newItemA("Une"));
items.add(newItemA("Une3"));
items.add(newItemA("Une4"));
items.add(newItemA("Une5"));
items.add(newItemA("Une6"));
items.add(newItemA("Une7"));
items.add(newItemA("Une8"));
items.add(newItemA("Une9"));
items.add(newItemA("Une0"));
items.add(newItemA("Une0-"));
items.add(newItemB("bbb6", "cc5c"));
items.add(newItemB("bbb7", "cc4c"));
items.add(newItemB("bbb7", "c2cc"));
items.add(newItemB("bbb8", "c1cc"));
items.add(newItemB("bbb9", "cc6c"));
items.add(newItemB("bbb0", "cc8c"));
items.add(newItemB("bbb0", "cc0c"));
items.add(newItemB("bb3b", "cc6c"));
SpecialAdapterb=newSpecialAdapter(this, items);
lv.setAdapter(b);
}
privateclassSpecialAdapterextendsBaseAdapter{
List<Items> list;
Context context;
publicSpecialAdapter(Context context, List<Items> list) {
this.list = list;
this.context = context;
}
public Context getContext(){
returnthis.context;
}
@OverridepublicintgetCount() {
return list.size();
}
@Overridepublic Items getItem(int position) {
return list.get(position);
}
@OverridepubliclonggetItemId(int position) {
return list.get(position).hashCode();
}
@OverridepublicintgetViewTypeCount() {
return2;
}
@OverridepublicintgetItemViewType(int position) {
Itemsb= getItem(position);
if(b instanceof ItemA){
return0;
}else{
return1;
}
}
@Overridepublic View getView(int position, View v, ViewGroup parent) {
Itemso= getItem(position);
if(v == null){
LayoutInflatervi= (LayoutInflater)this.getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(getItemViewType(position) == 0){
v = vi.inflate(
android.R.layout.simple_list_item_multiple_choice,
null
);
Log.i(this.getClass().getName(),
"Inflate two line"
);
}else{
v = vi.inflate(
android.R.layout.two_line_list_item,
null
);
Log.i(this.getClass().getName(),
"Inflate one line"
);
}
}
switch (getItemViewType(position)) {
case0:
ItemAoa= (ItemA)o;
((TextView)v.findViewById(android.R.id.text1)).setText(oa.toString());
break;
case1:
ItemBob= (ItemB)o;
((TextView)v.findViewById(android.R.id.text1)).setText(ob.toString());
((TextView)v.findViewById(android.R.id.text2)).setText(ob.getClasse());
break;
}
return v;
}
}
privateabstractclassItems {}
privateclassItemAextendsItems {
String name;
publicItemA(String name) {
this.name = name;
}
@Overridepublic String toString() {
return"ItemA: " + name;
}
}
privateclassItemBextendsItems {
private String name;
private String classe;
publicItemB(String name, String classe) {
this.name = name;
this.classe = classe;
}
public String getClasse(){
return classe;
}
@Overridepublic String toString() {
return"ItemB: " + name;
}
}
}
I'll try to write a sample and come up with an update soon. I think I'm missing something because when views are recycled you need to check if the recycled view correspond to the ItemType. But you can definitely do it through a ListView alone. No scrollable needed.
Post a Comment for "Google's Mentality: Listview In Scrollview"