【问题标题】:Android ListView that does not scroll?不滚动的Android ListView?
【发布时间】:2010-07-07 07:04:43
【问题描述】:

我正在尝试制作一个类似于 android 市场的布局......在 cmets 下说有什么似乎是 ListView 但它不滚动(整个页面滚动但不是cmets)。我不确定它是否甚至是 ListView,但我想要一些看起来像列表视图的东西(即有那些分隔条,还有什么不是但不可滚动)。有人建议使用LinearLayout 而不是ListView,但我也希望这些项目可以点击并打开一个新活动。请帮忙?

我现在的布局树是这样的

<LinearLayout>
  <ScrollView>
     <RelativeLayout>

我希望将内容放入RelativeLayout

【问题讨论】:

  • 现在支持库允许使用&lt;NestedScrollView&gt;&lt;RecyclerView&gt; 使其更容易。 NestedScrollView 可以包含任何布局,其中包含多个简单或回收器视图

标签: android xml layout android-listview


【解决方案1】:

正如在 GoogleIo 的 video 中执行 listView 的程序员所解释的那样,从未将 ListView 放入滚动视图中。如果您的列表不应滚动,请使用线性布局之类的 ViewGroup,并在代码中循环将所有项目添加到此 ViewGroup。如果您希望整行可单击,则必须使用另一个 ViewGroup 作为每行的根节点并将 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);
   }
}

此代码将为您拥有的每个项目生成一个视图并将其放入 viewGroup。在除最后一项之外的每个项目之后,它还将向 viewGroup 添加一个分隔符。

【讨论】:

  • thanks =) 在弄清楚 LayoutInflater 是什么以及如何使用它之后,我最终使用了这个方法......现在我只需要在 xml 中美化东西。
  • 快速提问...如何在单击时突出显示视图?
  • @Kman 我知道这是一篇旧帖子,但您知道如何在点击子视图后突出显示它吗?
【解决方案2】:

我有同样的问题。我只是用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();
        }
    }
}

希望这会有所帮助!

【讨论】:

  • 如果由于行重用而在此“LinearListView”中有很多项目,这是一个坏主意。
  • @PaNaVTEC:行重用有什么不好?是否使用convertView也取决于适配器,那又如何?
  • 您的 LinearListView 没有重用行,这就是问题所在。 listView 将仅显示可见行,当您滚动时将重用这些行,那么您在内存中只有可见行。使用 LinearlistView,您可以在内存中存储您在适配器中填充的所有行。另外我认为对于一小组行来说是一个不错的解决方案
  • 您的解决方案非常适合我当前的需求。但是当我实现它时,我只得到了从我的适配器添加的第一个项目。
【解决方案3】:

我没有足够的声誉点来评论,但对于那些只有 1 个项目出现在 Nappy 的解决方案中的人,请确保您在布局文件中设置以下内容:

    android:orientation="vertical"

否则,似乎只添加了一项,但实际上它们只是水平添加...希望这对某人有所帮助。

【讨论】:

    【解决方案4】:

    您可以创建一个ListView 并将所有内容放入其中,这样整个页面就会滚动。您可以推出自己的适配器实现,但我建议使用 CommonsWare 的优秀 MergeAdapter 您可以使用addView() 添加标签或分隔条,使用addAdapter() 添加列表。查看该页面以获取有关使用情况和演示项目的更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多