Android 两个列表视图&;卷轴视图

Android 两个列表视图&;卷轴视图,android,android-layout,Android,Android Layout,我离这里太近了,我试过很多东西,但都没能成功。我这里有两个列表视图。我想让每个listview显示其全部内容。我不希望列表视图可以滚动。我想要一个滚动视图,它可以滚动列表视图。我能得到的最接近的结果(这是错误的)是每个列表视图都是可滚动的。这意味着每个listview只显示1/2个单元格。我认为这将是一个非常简单的任务,但Android有一些奇怪的事情在进行 同样,每个列表视图显示其全部内容,即使内容高度超过屏幕。然后我要做的就是向下滚动查看第二个列表视图,它显示了它的全部内容 <?xml

我离这里太近了,我试过很多东西,但都没能成功。我这里有两个列表视图。我想让每个listview显示其全部内容。我不希望列表视图可以滚动。我想要一个滚动视图,它可以滚动列表视图。我能得到的最接近的结果(这是错误的)是每个列表视图都是可滚动的。这意味着每个listview只显示1/2个单元格。我认为这将是一个非常简单的任务,但Android有一些奇怪的事情在进行

同样,每个列表视图显示其全部内容,即使内容高度超过屏幕。然后我要做的就是向下滚动查看第二个列表视图,它显示了它的全部内容

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent"
android:layout_width="wrap_content"
android:orientation="vertical"
android:fillViewport="true">
<LinearLayout
android:layout_height="fill_parent"
android:layout_width="wrap_content"
android:orientation="vertical"
android:fillViewport="true">
<LinearLayout 
android:layout_weight="10"
android:orientation="vertical"
android:layout_height="wrap_content"
android:layout_width="fill_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#CCCCCC"
android:text="@string/alerts_top_title"
android:gravity="center"
android:textColor="#000000"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true">
</TextView>
<ListView 
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/cameraListAlerts" >
</ListView>
</LinearLayout>
<LinearLayout 
android:layout_weight="10"
android:orientation="vertical"
android:layout_height="wrap_content"
android:layout_width="fill_parent">
<TextView
android:gravity="center"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#CCCCCC"
android:textColor="#000000"
android:text="@string/alerts_bottom_title">
</TextView>
<LinearLayout 
android:layout_width="fill_parent"
android:layout_height="8dp">
</LinearLayout>
<Button
android:id="@+id/addRecipient"
android:layout_height="50dp"
android:layout_width="fill_parent"
android:layout_centerHorizontal="true"
android:text="@string/addRecipient"/>

<ListView 
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/recipientListAlerts" >
</ListView>
</LinearLayout>
</LinearLayout>
</ScrollView>

如果它真的起作用的话,你将花费更多的时间和精力来实现它<代码>列表视图s用于处理需要一次绘制太多资源的长列表。当您滚动行视图以允许快速加载时,它们会循环行视图。您试图放弃该功能,从而使您对
ListView
的使用实际上毫无意义

以编程方式填充
LinearLayout
并没有什么大不了的。您的行有XML文件吗?当您在数组中运行极其简单的
for
循环或
时,为每一新行将其充气,同时
在光标中循环,绑定数据,并将其添加到
LinearLayout

完成了。没有滚动问题。。。一切都由ScrollView处理,就像它应该做的那样。

试试这个

private ListView first, second;
private String check="";
String[] COUNTRIES = new String[] { "Afghanistan", "Albania",
        "Algeria", "American Samoa", "Andorra", "Angola", "Anguilla",
        "Antarctica", "Antigua and Barbuda", "Argentina", "Armenia",
        "Aruba", "Australia", "Austria", "Azerbaijan", "Bahrain",
        "Montserrat", "Morocco",
        "Mozambique", "Myanmar", "Namibia", "Nauru", "NepalA",
        "Montserrat", "MoroccoF",
        "Mozambique", "Myanmar", "Namibia", "Nauru", "NepalB",
        "Montserrat", "MoroccoD",
        "Mozambique", "Myanmar", "Namibia", "Nauru", "NepalC",

};

String[] COUNTRIES1 = new String[] { "Martinique",
        "Mauritania", "Mauritius", "Mayotte", "Mexico", "Micronesia",
        "Moldova", "Monaco", "Mongolia", "Montserrat", "Morocco",
        "Mozambique", "Myanmar", "Namibia", "Nauru", "Nepal", };
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    first = (ListView) findViewById(R.id.firstlist);
    second = (ListView) findViewById(R.id.secondlist);

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, COUNTRIES);
    ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, COUNTRIES1);

    first.setAdapter(adapter);
    second.setAdapter(adapter1);

     second.setOnTouchListener(new OnTouchListener() {
     @Override
     public boolean onTouch(View arg0, MotionEvent arg1) {
         check="second";
     return false;
     }
      });

     first.setOnTouchListener(new OnTouchListener() {
         @Override
         public boolean onTouch(View arg0, MotionEvent arg1) {
             check="first";
         return false;
         }
          });
     first.setOnScrollListener(newScrollEvent);
     second.setOnScrollListener(newScrollEvent);
}

private OnScrollListener newScrollEvent = new OnScrollListener() {

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        // TODO Auto-generated method stub
        if(check.equalsIgnoreCase("first")){
         System.out.println("first");

         if (first.getChildAt(0) != null) {
         Rect r1 = new Rect();
         first.getChildVisibleRect(first.getChildAt(0), r1, null);
         second.setSelectionFromTop(first.getFirstVisiblePosition(),
         r1.top);
         }
        }
        else if(check.equalsIgnoreCase("second")){
        if (second.getChildAt(0) != null) {
         Rect r1 = new Rect();
         second.getChildVisibleRect(second.getChildAt(0), r1, null);
         first.setSelectionFromTop(second.getFirstVisiblePosition(),
         r1.top);
         }
         }
    }
};
私有列表视图第一,第二;
私有字符串检查=”;
字符串[]国家=新字符串[]{“阿富汗”、“阿尔巴尼亚”,
“阿尔及利亚”、“美属萨摩亚”、“安道尔”、“安哥拉”、“安圭拉”,
“南极洲”、“安提瓜和巴布达”、“阿根廷”、“亚美尼亚”,
“阿鲁巴”、“澳大利亚”、“奥地利”、“阿塞拜疆”、“巴林”,
“蒙特塞拉特”、“摩洛哥”,
“莫桑比克”、“缅甸”、“纳米比亚”、“瑙鲁”、“尼泊尔”,
“蒙特塞拉特”、“莫罗科夫”,
“莫桑比克”、“缅甸”、“纳米比亚”、“瑙鲁”、“尼泊尔”,
“蒙特塞拉特”、“莫罗科德”,
“莫桑比克”、“缅甸”、“纳米比亚”、“瑙鲁”、“NepalC”,
};
字符串[]COUNTRIES1=新字符串[]{“马提尼克”,
“毛里塔尼亚”、“毛里求斯”、“马约特”、“墨西哥”、“密克罗尼西亚”,
“摩尔多瓦”、“摩纳哥”、“蒙古”、“蒙特塞拉特”、“摩洛哥”,
“莫桑比克”、“缅甸”、“纳米比亚”、“瑙鲁”、“尼泊尔”};
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
first=(ListView)findViewById(R.id.firstlist);
second=(ListView)findViewById(R.id.secondlist);
ArrayAdapter=新的ArrayAdapter(此,
android.R.layout.simple_list_item_1,国家/地区);
ArrayAdapter适配器1=新的ArrayAdapter(此,
android.R.layout.simple_list_item_1,国家1);
首先,设置适配器(适配器);
第二,设置适配器(适配器1);
second.setOnTouchListener(新的OnTouchListener(){
@凌驾
公共布尔onTouch(视图arg0、运动事件arg1){
check=“second”;
返回false;
}
});
setOnTouchListener(新的OnTouchListener(){
@凌驾
公共布尔onTouch(视图arg0、运动事件arg1){
check=“first”;
返回false;
}
});
首先,setOnScrollListener(newScrolleEvent);
第二,setOnScrollListener(newScrolleEvent);
}
private OnScrollListener newScrolleEvent=新OnScrollListener(){
@凌驾
公共无效onScrollStateChanged(AbsListView视图,int scrollState){
//TODO自动生成的方法存根
}
@凌驾
public void onScroll(AbsListView视图,int firstVisibleItem,
int visibleItemCount,int totalItemCount){
//TODO自动生成的方法存根
如果(检查相等信号情况(“第一”)){
System.out.println(“第一”);
if(first.getChildAt(0)!=null){
Rect r1=新的Rect();
first.getChildVisibleRect(first.getChildAt(0),r1,null);
second.setSelectionFromTop(first.getFirstVisiblePosition(),
r1.顶部);
}
}
else if(检查相等信号情况(“第二”)){
if(second.getChildAt(0)!=null){
Rect r1=新的Rect();
second.getChildVisibleRect(second.getChildAt(0),r1,null);
first.setSelectionFromTop(second.getFirstVisiblePosition(),
r1.顶部);
}
}
}
};

在运行时以这种方式创建scrollview

 //find parent xml layout
         LinearLayout lL1 =(LinearLayout)rootView.findViewById(R.id.pro_scroll);

        //Create ScrollView programatically 
            ScrollView _scrollView  = new ScrollView(appContext);
           _scrollView.setBackgroundColor(Color.WHITE);
           _scrollView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
    LayoutParams.MATCH_PARENT));

        ViewGroup layout=new LinearLayout(appContext);
                           layout.setLayoutParams(new   ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

//add scrollview to layout 
                           layout.addView(_scrollView);
//add layout to xml parent layout
                           lL1.addView(layout);

ListView
s不要进入
ScrollView
s。以编程方式在线性布局中填充列表,而不是使用
ListView
s。那正是你想要的。我就知道有一个会被扔出去。我有很多代码可以通过我的自定义适配器和事件处理程序(用于项目单击等)工作。我如何在不做大量修改的情况下合并您的方法?所以您宁愿强制ListView做一些它们不是为之设计的事情?任何有点ListView经验的人都知道,他们无法在相同方向的ScrollView中正常工作。我建议你看一下Google IO 2010的视频:什么样的项目点击?行点击?我只需将行XML中的
android:onClick
设置为某个方法,然后在循环中使用
setTag(index[array]或id[cursor])
,这样您就可以在传递给onClick属性中设置的方法的视图上调用
getTag()
,并识别单击了哪个项。然后你可以相应地采取行动。也许有一种更优雅的方法可以做到这一点。对于该视图中的其他视图(例如,单击描述联系人的行中的图像),我将创建一个非常快速的自定义视图。这听起来像是很多的w