谷歌的心态:在的ListView滚动型 [英] Google's Mentality: ListView in ScrollView

查看:172
本文介绍了谷歌的心态:在的ListView滚动型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我可怜的菜鸟之一,谁想要把的ListView 滚动型

I'm one of the poor noobs who wanted to put a ListView inside a ScrollView.

现在据我了解,他们不希望嵌套的滚动元素 - 我不知道,我和他们的设计一致,但我能理解它。我不明白的是为什么我不能让一个非滚动的ListView 和窝到另一个滚动元素。

Now I understand that they don't want nested scrollable elements - I'm not sure that I agree with their design but I can understand it. What I cannot understand is why I can't make a non-scrollable ListView and nest it into another Scrollable element.

listView.setScrollContainer(假)似乎是解决(因为我认为它可能关闭的ListView的滚动性),但没有运气。

listView.setScrollContainer(false) seemed like the solution (because I thought it could turn off the scrollability of the ListView) but no luck.

所以,有人可以解释为什么谷歌不会让列表视图不滚动 - 有没有办法做到这一点,这numpty只是无视

So can someone explain why Google won't let listViews not scroll - is there a way to do this that this numpty is just oblivious to?

推荐答案

像梅拉说,你应该重新考虑你的UI。

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.

您已经存在的setHeader,setFooter。在那里,你只要把你想要的任何东西。你必须增加论文的观点setAdapter()之前。

You there have setHeader, setFooter. There you just have to put anything you want. You have to add theses views before setAdapter().

如果您在您的滚动视图多个列表视图。我对你的第二个解决方案。我真的不能细说。但是,你必须创建一个自定义适配器,并覆盖ViewTypeCount这样你就可以处理多种类型的项目。这样,你可以加载你想通过适配器的一切。和所有你真正需要的是一个ListView。

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"

您必须继承适配器和覆盖getView。习惯性的,我们应该有类似的看法回收利用的东西。

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;

public class Main extends Activity {
    private ListView lv;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        lv = (ListView)findViewById(R.id.lv);

        ArrayList<Items> items = new ArrayList<Items>();

        items.add(new ItemA("Une"));
        items.add(new ItemA("Une3"));
        items.add(new ItemA("Une4"));
        items.add(new ItemA("Une5"));
        items.add(new ItemA("Une6"));
        items.add(new ItemA("Une7"));
        items.add(new ItemA("Une8"));
        items.add(new ItemA("Une9"));
        items.add(new ItemA("Une0"));
        items.add(new ItemA("Une0-"));
        items.add(new ItemB("bbb", "cc1c"));
        items.add(new ItemB("bbb3", "c2cc"));
        items.add(new ItemB("bbb4", "c2cc"));
        items.add(new ItemB("bbb5", "c1cc"));
        items.add(new ItemB("bbb6", "cc5c"));
        items.add(new ItemB("bbb7", "cc4c"));
        items.add(new ItemB("bbb7", "c2cc"));
        items.add(new ItemB("bbb8", "c1cc"));
        items.add(new ItemB("bbb9", "cc6c"));
        items.add(new ItemB("bbb0", "cc8c"));
        items.add(new ItemB("bbb0", "cc0c"));
        items.add(new ItemB("bb3b", "cc6c"));
        items.add(new ItemA("Une"));
        items.add(new ItemA("Une3"));
        items.add(new ItemA("Une4"));
        items.add(new ItemA("Une5"));
        items.add(new ItemA("Une6"));
        items.add(new ItemA("Une7"));
        items.add(new ItemA("Une8"));
        items.add(new ItemA("Une9"));
        items.add(new ItemA("Une0"));
        items.add(new ItemA("Une0-"));
        items.add(new ItemB("bbb6", "cc5c"));
        items.add(new ItemB("bbb7", "cc4c"));
        items.add(new ItemB("bbb7", "c2cc"));
        items.add(new ItemB("bbb8", "c1cc"));
        items.add(new ItemB("bbb9", "cc6c"));
        items.add(new ItemB("bbb0", "cc8c"));
        items.add(new ItemB("bbb0", "cc0c"));
        items.add(new ItemB("bb3b", "cc6c"));

        SpecialAdapter b = new SpecialAdapter(this, items);
        lv.setAdapter(b);

    }

    private class SpecialAdapter extends BaseAdapter{

        List<Items> list;
        Context context;

        public SpecialAdapter(Context context, List<Items> list) {
            this.list = list;
            this.context = context;
        }

        public Context getContext(){
            return this.context;
        }

        @Override
        public int getCount() {
            return list.size();
        }

        @Override
        public Items getItem(int position) {
            return list.get(position);
        }

        @Override
        public long getItemId(int position) {
            return list.get(position).hashCode();
        }

        @Override
        public int getViewTypeCount() {
            return 2;
        }

        @Override
        public int getItemViewType(int position) {
            Items b = getItem(position);
            if(b instanceof ItemA){
                return 0;
            }else{
                return 1;
            }
        }



        @Override
        public View getView(int position, View v, ViewGroup parent) {
            Items o = getItem(position);
            if(v == null){
                LayoutInflater vi = (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)) {
            case 0:
                ItemA oa = (ItemA)o;
                ((TextView)v.findViewById(android.R.id.text1)).setText(oa.toString());
                break;
            case 1:
                ItemB ob = (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;
        }

    }

    private abstract class Items {}

    private class ItemA extends Items {
        String name;

        public ItemA(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return "ItemA: " + name;
        }
    }

    private class ItemB extends Items {
        private String name;
        private String classe;

        public ItemB(String name, String classe) {
            this.name = name;
            this.classe = classe;
        }

        public String getClasse(){
            return classe;
        }

        @Override
        public String toString() {
            return "ItemB: " + name;
        }
    }
}

我会尝试写一个样本,并很快拿出了更新。我想我失去了一些东西,因为当意见被回收,你需要检查,如果回收的观点对应的ItemType。但是你绝对可以做到这一点通过一个ListView孤独。没有滚动需要。

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.

这篇关于谷歌的心态:在的ListView滚动型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆