不滚动的Android ListView?
我正在尝试做一个类似于android market的布局……比如说在评论下面有一个看起来像是不滚动的Android ListView?,android,xml,layout,android-listview,Android,Xml,Layout,Android Listview,我正在尝试做一个类似于android market的布局……比如说在评论下面有一个看起来像是列表视图的东西,但它不滚动(整个页面滚动,但不是评论)。我不确定它是否是一个列表视图,但我想要一个类似列表视图的东西(例如,有那些分隔条等等,不能滚动)。有人建议使用线性布局而不是列表视图,但我也希望项目可以单击并打开新活动。请帮忙 我当前的布局树是这样的 <LinearLayout> <ScrollView> <RelativeLayout> 我希
列表视图的东西,但它不滚动(整个页面滚动,但不是评论)。我不确定它是否是一个列表视图,但我想要一个类似列表视图的东西(例如,有那些分隔条等等,不能滚动)。有人建议使用线性布局
而不是列表视图
,但我也希望项目可以单击并打开新活动。请帮忙
我当前的布局树是这样的
<LinearLayout>
<ScrollView>
<RelativeLayout>
我希望将内容放在RelativeLayout
中。您可以制作一个列表视图
并将所有内容放在其中,这样整个页面都会滚动。您可以推出自己的适配器实现,但我建议使用Commonware的优秀功能
您可以使用addView()
添加标签或分隔条,使用addAdapter()
添加列表。查看该页面,了解更多有关用法和演示项目的信息。正如在GoogleIo中创建listView的程序员所解释的,从来没有将listView放在滚动视图中。如果您的列表不应滚动,请使用类似线性布局的视图组,并在代码中的循环中将所有项目添加到此视图组。如果希望整行可单击,则必须使用另一个视图组作为每行的根节点,并将OnClickListener添加到此视图
示例代码:
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
for (int current = 0; current < itemCount; current++) {
View view = inflater.inflate(R.layout.layout_id, parent, false);
//initialize the view
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), CLASS_TO_START)
startActivity(intent);
}
});
viewGroup.addView(view);
if (current < itemCount - 1) {
inflater.inflate(R.layout.line, viewGroup);
}
}
LayoutInflater充气器=(LayoutInflater)getSystemService(Context.LAYOUT\u充气器\u SERVICE);
对于(int current=0;current
此代码将为您拥有的每个项目生成一个视图,并将其放入viewGroup。除了最后一项之外,每个项目后面都会添加一个分隔符到视图组。我也有同样的问题。我只是用一个setAdapter
方法扩展了默认的LinearLayout
:
public class LinearListView extends LinearLayout
{
Adapter adapter;
Observer observer = new Observer(this);
public LinearListView(Context context)
{
super(context);
}
public LinearListView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public LinearListView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
public void setAdapter(Adapter adapter)
{
if (this.adapter != null)
this.adapter.unregisterDataSetObserver(observer);
this.adapter = adapter;
adapter.registerDataSetObserver(observer);
observer.onChanged();
}
private class Observer extends DataSetObserver
{
LinearListView context;
public Observer(LinearListView context)
{
this.context = context;
}
@Override
public void onChanged()
{
List<View> oldViews = new ArrayList<View>(context.getChildCount());
for (int i = 0; i < context.getChildCount(); i++)
oldViews.add(context.getChildAt(i));
Iterator<View> iter = oldViews.iterator();
context.removeAllViews();
for (int i = 0; i < context.adapter.getCount(); i++)
{
View convertView = iter.hasNext() ? iter.next() : null;
context.addView(context.adapter.getView(i, convertView, context));
}
super.onChanged();
}
@Override
public void onInvalidated()
{
context.removeAllViews();
super.onInvalidated();
}
}
}
公共类LinearList视图扩展了LinearLayout
{
适配器;
观察者=新观察者(本);
public LinearListView(上下文)
{
超级(上下文);
}
public LinearListView(上下文、属性集属性)
{
超级(上下文,attrs);
}
public LinearListView(上下文、属性集属性、int-defStyle)
{
超级(上下文、属性、定义样式);
}
公共void setAdapter(适配器适配器)
{
if(this.adapter!=null)
this.adapter.unregistedatasetobserver(observer);
this.adapter=适配器;
adapter.registerDataSetObserver(观察者);
observer.onChanged();
}
私有类Observer扩展了DataSetoObserver
{
线性主义语境;
公共观察者(LinearListView上下文)
{
this.context=上下文;
}
@凌驾
更改后的公共无效()
{
List oldViews=new ArrayList(context.getChildCount());
for(int i=0;i
希望这有帮助 我没有足够的声誉点来评论,但是对于那些在Nappy的解决方案中只有一个项目的人,请确保在布局文件中设置以下内容:
android:orientation="vertical"
否则,看起来只添加了一个项目,但实际上它们只是水平添加的……希望这对其他人有所帮助。谢谢=)我在弄清楚什么是布局平坦器以及如何使用它之后,最终使用了这种方法……现在我只需要用xml美化一下。快速提问……我在添加时如何突出显示视图单击它?@Kman我知道这是一篇旧文章,但你知道如何在单击子视图后突出显示它吗?如果因为行重用而在“LinearListView”中有很多项,这是个坏主意。@PaNaVTEC:行重用有什么坏处?如果convertView正在使用或未使用,这也取决于适配器,那又怎样?LinearListView没有重用行,这就是问题所在。listView将只显示可见的行,当您滚动时将重用这些行,那么内存中只有可见的行。使用LinearlistView,您在内存中拥有在适配器中填充的所有行。另外,我认为这是一个很好的解决方案,适用于一小部分行。您的解决方案将完全符合我当前的需要。但当我实现它时,我只从适配器中添加了第一项。现在,支持库允许使用
和
使它变得更容易。NestedScrollView可以包含任何布局,其中包含许多简单视图或回收器视图