`
xuehaipeng
  • 浏览: 52747 次
  • 性别: Icon_minigender_1
  • 来自: 西安
最近访客 更多访客>>
社区版块
存档分类
最新评论

scrollView中实现listView的解决方法

阅读更多
scrollView中实现listView的解决方法
1.自定义view,采用继承LinearLayout的方式
2.继承Adapter,本例中采用两种方式进行演示:
   1.ArrayAdapter 2.BaseAdapter

先是第一种ArrayAdapter:
package com.terry.widget;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class ArrayAdapterForLinearLayout extends ArrayAdapter<String> {

	private LayoutInflater mInflater;
	private int resource;
	private List<String> data;
	private int to;
	
	public ArrayAdapterForLinearLayout(Context context, int resource,
			int textViewResourceId, List<String> objects) {
		super(context, resource, textViewResourceId, objects);
		this.resource = resource;
		this.data = objects;
		this.to = textViewResourceId;
		this.mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}
	
	
	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return data.size();
	}


	@Override
	public String getItem(int position) {
		// TODO Auto-generated method stub
		return data.get(position);
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		convertView = mInflater.inflate(resource, null);
		String content = data.get(position);
		View view = convertView.findViewById(to);
		if (view instanceof TextView) {
			((TextView) view).setText(content == null ? "" : content);
		}
		convertView.setTag(position);
		return convertView;
	}
	
}


package com.terry.widget;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;

public class LinearLayoutForListView extends LinearLayout {
	private ArrayAdapterForLinearLayout adapter = null;
	private OnClickListener onClickListener = null;

	public LinearLayoutForListView(Context context) {
		super(context);
	}
	
	public LinearLayoutForListView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
	}

	/**
	 * 绑定布局
	 */
	public void bindLinearLayout() {
		int count = adapter.getCount();
		for (int i=0;i<count;i++) {
			View view = adapter.getView(i, null, null);
			view.setOnClickListener(this.onClickListener);                            
            //用来消除最后一个下划线
			if (i == count-1) {
				LinearLayout ly = (LinearLayout) view;
				ly.removeViewAt(1);
			}
			addView(view,i);
		}
	}
	
	public ArrayAdapterForLinearLayout getAdapter() {
		return adapter;
	}

	public void setAdapter(ArrayAdapterForLinearLayout adapter) {
		this.adapter = adapter;
		bindLinearLayout();
	}

	public OnClickListener getOnClickListener() {
		return onClickListener;
	}

	public void setOnClickListener(OnClickListener onClickListener) {
		this.onClickListener = onClickListener;
	}
	
}


package com.terry.widget;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ScrollView;

public class Main extends Activity {
    private LinearLayoutForListView lv = null;
    private List<String> list = new ArrayList<String>();
	private ScrollView scrollView = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        scrollView = (ScrollView) findViewById(R.id.MAIN_VIEW_DETAIL);
		scrollView.setSmoothScrollingEnabled(true);
		scrollView.fullScroll(ScrollView.FOCUS_UP);
		scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        lv = (LinearLayoutForListView) findViewById(R.id.ListView01);
        for (int i=0;i<40;i++) {
        	list.add("name"+i);
        }
        ArrayAdapterForLinearLayout layoutadapter = new ArrayAdapterForLinearLayout(this, R.layout.test, R.id.TextView01, list);
        lv.setAdapter(layoutadapter);
    }
}

main.xml  主布局xml
<?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="fill_parent"
	android:id="@+id/MAIN_VIEW_DETAIL" android:scrollbars="vertical">
<com.terry.widget.LinearLayoutForListView 
	android:orientation="vertical" android:layout_width="450px"
    android:layout_height="fill_parent" android:id="@+id/ListView01">
</com.terry.widget.LinearLayoutForListView>
</ScrollView>


test.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent" android:orientation="vertical"
  android:layout_height="fill_parent">
  
  <TextView android:id="@+id/TextView01"
        android:layout_marginLeft="10px"
        android:layout_width="wrap_content" android:layout_height="wrap_content">
    </TextView>
    
    <View android:layout_height="1px" android:background="#FFFFFF"
        android:layout_width="fill_parent"></View>
  
</LinearLayout>



第二种BaseAdapter:
package com.terry.widget;

import java.util.List;
import java.util.Map;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class AdapterForLinearLayout extends BaseAdapter {
	private LayoutInflater mInflater;
	private int resource;
	private List<? extends Map<String, ?>> data;
	private String[] from;
	private int[] to;
	
	
	
	public AdapterForLinearLayout(Context context, List<? extends Map<String, ?>> data, int resouce, String[] from, int[] to) {
		this.data = data;
		this.resource = resouce;
		this.data = data;
		this.from = from;
		this.to = to;
		this.mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return data.size();
	}

	@Override
	public Object getItem(int arg0) {
		// TODO Auto-generated method stub
		return data.get(arg0);
	}
	
	@SuppressWarnings("unchecked")
	public String get(int position,Object key) {
		Map<String, ?> map = (Map<String, ?>) getItem(position);
		return map.get(key).toString();
	}
	
	@Override
	public long getItemId(int arg0) {
		// TODO Auto-generated method stub
		return arg0;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		convertView = mInflater.inflate(resource, null);
		Map<String, ?> item = data.get(position);
		int count = to.length;
		for (int i=0;i<count;i++) {
			View view = convertView.findViewById(to[i]);
			bindView(view, item, from[i]);
		}
		convertView.setTag(position);
		return convertView;
	}
	
	private void bindView(View view,Map<String, ?> item,String from) {
		Object data = item.get(from);
		if (view instanceof TextView) {
			((TextView) view).setText(data == null ? "" : data.toString());
		}
	}
}


package com.terry.widget;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;

public class LinearLayoutForListView extends LinearLayout {
	private AdapterForLinearLayout adapter = null;
	private OnClickListener onClickListener = null;

	public LinearLayoutForListView(Context context) {
		super(context);
	}
	
	public LinearLayoutForListView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
	}

	/**
	 * 绑定布局
	 */
	public void bindLinearLayout() {
		int count = adapter.getCount();
		for (int i=0;i<count;i++) {
			View view = adapter.getView(i, null, null);
			view.setOnClickListener(this.onClickListener);
			if (i == count-1) {
				LinearLayout ly = (LinearLayout) view;
				ly.removeViewAt(2);
			}
			addView(view, i);
		}
	}
	
	public AdapterForLinearLayout getAdapter() {
		return adapter;
	}

	public void setAdapter(AdapterForLinearLayout adapter) {
		this.adapter = adapter;
		bindLinearLayout();
	}

	public OnClickListener getOnClickListener() {
		return onClickListener;
	}

	public void setOnClickListener(OnClickListener onClickListener) {
		this.onClickListener = onClickListener;
	}
	
}


package com.terry.widget;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ScrollView;

public class Main extends Activity {
    private LinearLayoutForListView lv = null;
	private List<HashMap<String, Object>> list = new ArrayList<HashMap<String,Object>>();
	private ScrollView scrollView = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        scrollView = (ScrollView) findViewById(R.id.MAIN_VIEW_DETAIL);
		scrollView.setSmoothScrollingEnabled(true);
		scrollView.fullScroll(ScrollView.FOCUS_UP);
		scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        lv = (LinearLayoutForListView) findViewById(R.id.ListView01);
        for (int i = 0; i < 10; i++) {
            HashMap<String, Object> map = new HashMap<String, Object>();
            map.put("key_name", "name" + i);
            map.put("value_name", "value" + i);
            list.add(map);
        }
        AdapterForLinearLayout layoutadapter = new AdapterForLinearLayout(this, list, R.layout.test, new String[] { "key_name",
        "value_name" }, new int[] { R.id.TextView01,R.id.TextView02 });
        lv.setAdapter(layoutadapter);
    }
}


主布局xml man.xml
<?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="fill_parent"
	android:id="@+id/MAIN_VIEW_DETAIL" android:scrollbars="vertical">
<com.terry.widget.LinearLayoutForListView 
	android:orientation="vertical" android:layout_width="450px"
    android:layout_height="fill_parent" android:id="@+id/ListView01">
</com.terry.widget.LinearLayoutForListView>
</ScrollView>

test.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent" android:orientation="vertical"
  android:layout_height="fill_parent">
  
  <TextView android:id="@+id/TextView01"
        android:layout_marginLeft="10px" android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_width="wrap_content" android:layout_height="wrap_content">
    </TextView>
    <TextView android:id="@+id/TextView02" android:layout_width="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:layout_marginLeft="10px" android:layout_height="wrap_content">
    </TextView>
    
    <View android:layout_height="1px" android:background="#FFFFFF"
        android:layout_width="fill_parent"></View>
  
</LinearLayout>

事件操作,并通过下标得到数据源:
lv.setOnclickLinstener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(
                        BlueToothActivity.this,
                        Layoutadpater.get(Integer.parseInt(v.getTag()
                                .toString()), "key_name"), 1000).show();
            }
        });
        lv.setAdapter(Layoutadpater);
分享到:
评论
3 楼 xuehaipeng 2011-12-30  
龙哥IT 写道
这个案例可不可以分页啊?

这个例子只是支持ScrollView和ListView并存,动态数据加载以及分页我没做。
2 楼 龙哥IT 2011-11-24  
动态加载分页
1 楼 龙哥IT 2011-11-24  
这个案例可不可以分页啊?

相关推荐

    ScrollView中自定义ListView

    4. 在ScrollView中添加自定义的ListView,并确保内容填充到ListView中。 通过这种方式,我们自定义的ListView可以在ScrollView中正常工作,既保留了ListView的滚动优化,又解决了与ScrollView的冲突问题。在实际...

    ScrollView中嵌套Listview(两个)

    3. **使用HeadView和FootView**:在ListView中添加HeadView和FootView,模拟ScrollView的效果。将需要在ScrollView中显示的内容作为ListView的头尾视图,然后让ListView中的其他内容滚动。但这种方法可能不适用于...

    ScrollView中嵌套ListView的例子

    接下来,我们来看如何在代码中实现ScrollView嵌套ListView: 1. 首先,创建一个布局文件,将NestedScrollView作为根视图,然后在其内部添加一个LinearLayout或其他布局,作为ListView的父视图。 2. 在LinearLayout...

    解决Scrollview嵌套listview下拉刷新的一些问题

    2. 对ListView中的每个Item进行复用,通过Adapter的convertView机制减少对象创建。 3. 使用ViewHolder模式提高ListView的滚动性能。 ### 文件`TestPullDown` 这个文件可能是用于测试下拉刷新功能的代码示例或资源...

    ListViewForScrollView实现Scrollview中嵌套listView.zip

    标题“ListViewForScrollView实现Scrollview中嵌套listView.zip”指的是一个解决方案,它允许在ScrollView内集成ListView,同时确保两者都能独立滑动,而不会相互干扰。 首先,我们要理解Android中的ScrollView和...

    解决scrollView和listview滚动冲突,实现listview滑动到顶端和底部之后还能拖拽一定的距离,松开后返回

    在Android开发中,ScrollView和ListView是两种常用的布局组件,它们分别用于实现可滚动的大视图和展示多行可滚动的数据列表。然而,在实际应用中,当这两种组件同时存在于一个界面时,滚动冲突的问题就会出现,导致...

    android 解决ScrollView和listView嵌套冲突问题(保证在ScrollView中滑动listView只响应listView的滑动)

    本篇将详细介绍如何解决这种冲突,确保在ScrollView中滑动ListView时,只响应ListView的滑动。 首先,我们要理解ScrollView和ListView的工作原理。ScrollView是一个可滚动的布局容器,它可以包含一个或多个视图,并...

    四种方法解决ScrollView嵌套Listview

    这种方式将ScrollView的功能合并到ListView中,避免了直接嵌套。例如: ```java View headerView = getLayoutInflater().inflate(R.layout.scrollable_header, null); listView.addHeaderView(headerView); ``` **...

    ScrollView中嵌套listview

    在ListView中,你需要确保在手指离开屏幕时将滑动事件传递回ScrollView。 ```java public class CustomScrollView extends ScrollView { // ... @Override public boolean onInterceptTouchEvent(MotionEvent ev...

    ScrollView中嵌套ListView,还可以嵌套多个listview 解决无法共存问题

    ScrollView中嵌套ListView,还可以嵌套多个listview 解决无法共存问题。放到项目中可以直接用

    ScrollView中嵌入ListView的例子

    总之,虽然在ScrollView中嵌入ListView可以实现特定的布局需求,但这并不推荐,因为它可能导致性能问题和用户体验下降。更建议采用RecyclerView或者利用ListView的footer功能来实现类似效果。在实际开发中,应根据...

    Scrollview中嵌套listview,listview中再嵌套listview

    解决方法是在ListView中设置`android:nestedScrollingEnabled="false"`,防止ListView内部的滚动影响到外层的ScrollView。 2. **性能优化**:嵌套列表会导致重绘次数增多,影响性能。尽量减少嵌套层数,对于嵌套的...

    Android中在ScrollView中显示ListView

    ListView的高度出了问题,始终只显示一点,并且滑动也有问题,Android默认是禁止将ListView潜逃在ScrollView里面的,虽然这种设计不被推崇,但是后来到Stackoverflow上找到了一个解决方法,那就是在为ListView设置...

    解决ScrollView嵌套ListView Demo

    同时,在ListView中,我们可以在需要时调用父View(即ScrollView)的requestDisallowInterceptTouchEvent(true)方法,禁止父View截取触摸事件。 以下是一个简单的示例代码,展示了如何实现这个解决方案: ```java ...

    android中scrollview与listview共存

    解决方法是在ListView内部使用一个独立的ScrollView,或者使用嵌套滚动(NestedScrolling)API,如NestedScrollView,它能够更好地处理嵌套滚动场景。 2. **性能问题**:由于ScrollView会尝试加载其所有子视图,这...

    Android解决ScrollView和ListView冲突问题Demo

    本Demo通过自定义ListView,实现了在ScrollView中嵌套ListView而不发生冲突的效果,从而提供了一种有效的解决方案。通过学习和实践这个Demo,开发者可以更深入地理解Android布局组件的交互,并能更好地处理类似的...

    ScrollView,嵌套ListView,ListView并同时嵌套GridView

    在Android开发中,ScrollView、ListView和GridView是三个非常重要的视图组件,它们分别用于实现不同的滚动展示效果。本文将深入探讨如何在Android应用中正确地嵌套这些组件,以及处理可能遇到的问题。 首先,...

    解决scrollview嵌套listview的冲突问题

    用于解决scrollview组件嵌套listview组件时候 两者之间的冲突问题

    scrollview与listview,viewpager共存

    本文将深入探讨如何正确地在Android应用中实现ScrollView与ListView、ViewPager的共存。 首先,我们来看ScrollView。ScrollView是一个可以包含多个子视图并允许用户滚动查看这些视图的容器。它通常用于包含内容过多...

    Android中自定义ListView,解决scrollview嵌套listview 滑动事件冲突

    在提供的MyListView文件中,可能就包含了自定义ListView解决滑动冲突的实现代码。通过查看和分析这个文件,我们可以学习到如何在代码层面解决此类问题,加深对Android事件分发机制的理解,并提升自定义控件的能力。 ...

Global site tag (gtag.js) - Google Analytics