Android中ScrollView中放Listview自适应高度示例

来源:赵克立博客 分类: Android 标签:Android发布时间:2015-07-17 16:50:47最后更新:2015-07-17 17:15:49浏览:5768
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。o_0。
更新时间:
2015-07-17 17:15:49
温馨提示:
学无止境,技术类文章有它的时效性,请留意文章更新时间,如发现内容有误请留言指出,防止别人"踩坑",我会及时更新文章

实现过程是scrollview包含着一个listview监听scrollview滚动到底边时开始向listview中添加数据

加载图片用到啦 universalimageloader  请自行引入下载地址在  http://www.zhaokeli.com/Article/6276.html

下面是一张效果图(里面用的是json加载数据使用的时候请更换成自己的数据)

QQ截图20150717171033.jpg

Screenshot_2015-07-17-16-51-54.png


首先是布局文件activity_home.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/white"
    android:orientation="vertical" >

<ScrollView
    android:id="@+id/scrollid"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >


   <!--产品列表  -->

      <ListView
             android:id="@+id/goodslist"
             android:layout_width="fill_parent"
             android:layout_height="fill_parent"
             android:background="@color/white"
             android:cacheColorHint="@android:color/transparent"
             android:divider="@color/border"
             android:dividerHeight="1px"
             android:listSelector="@drawable/list_item_selector" >
      </ListView>

       <TextView
           android:id="@+id/loading"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:gravity="center_vertical|center"
           android:background="@color/white"
           android:textColor="@color/black"
           android:text="@string/loading"
           android:visibility="gone" />

       </LinearLayout>
</ScrollView>
</LinearLayout>

下面是列表的适配器HomeGoodsListViewAdapter.java

package com.demo.adapter;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import com.demo.core.AsyncImageLoader;
import com.demo.jiuwo.R;
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;
import com.nostra13.universalimageloader.cache.disc.naming.HashCodeFileNameGenerator;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.LruMemoryCache;
import com.nostra13.universalimageloader.cache.memory.impl.UsingFreqLimitedMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.ImageSize;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.decode.BaseImageDecoder;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
import com.nostra13.universalimageloader.core.imageaware.ImageAware;
import com.nostra13.universalimageloader.core.imageaware.ImageViewAware;
import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener;
import com.nostra13.universalimageloader.utils.StorageUtils;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.os.Handler;
import android.support.v4.util.LruCache;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class HomeGoodsListViewAdapter extends BaseAdapter {
	static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>());
	  private Context context;                        //运行上下文   
	    private List<Map<String, Object>> listItems;    //商品信息集合   
	    private LayoutInflater listContainer;           //视图容器   
	    
	    public final class ListItemView{                //自定义控件集合          
	            public TextView title;
	            public TextView price;
	            public TextView goodsid;
	            public ImageView image; 
	    }    
	      
	    public HomeGoodsListViewAdapter(Context context) {  
	        this.context = context;           
	        listContainer = LayoutInflater.from(context);   //创建视图容器并设置上下文   
	        this.listItems=new ArrayList<Map<String, Object>>();
	    } 	      
	    public HomeGoodsListViewAdapter(Context context, List<Map<String, Object>> listItems) {  
	        this.context = context;           
	        listContainer = LayoutInflater.from(context);   //创建视图容器并设置上下文   
	        this.listItems = listItems;  
	    }  
	  public void addItem(Map<String,Object> o){
		  listItems.add(o);
	  }
	    public int getCount() {  
	        // TODO Auto-generated method stub   
	        return listItems.size();  
	    }  
	  
	    public Object getItem(int arg0) {  
	        // TODO Auto-generated method stub   
	        return null;  
	    }  
	  
	    public long getItemId(int arg0) {  
	        // TODO Auto-generated method stub   
	        return 0;  
	    }  
	         
	    /** 
	     * ListView Item设置 
	     */  
	    public View getView(int position, View convertView, ViewGroup parent) {  
	        // TODO Auto-generated method stub 
	    	//自定义视图   
	        ListItemView  listItemView = null;  
	        if (convertView == null) {  
	            listItemView = new ListItemView();   
	            //获取list_item布局文件的视图   
	            convertView = listContainer.inflate(R.layout.home_goodslist_item, null);  
	            //获取控件对象     
	            listItemView.title = (TextView)convertView.findViewById(R.id.titleItem);
	            listItemView.price = (TextView)convertView.findViewById(R.id.price);
	            listItemView.image = (ImageView)convertView.findViewById(R.id.imageItem);
	            listItemView.goodsid = (TextView)convertView.findViewById(R.id.goodsid);
		        //设置控件集到convertView   
	            convertView.setTag(listItemView);
	        }else{
	        	listItemView = (ListItemView)convertView.getTag(); 	 
	        }
	        
	        //设置文字和图片   
	        String imgurl=(String) listItems.get(position).get("pic");
	        loadBitmap(imgurl,listItemView.image,R.drawable.default_ico);
	        listItemView.goodsid.setText((String) listItems.get(position)  
	                .get("goodsid"));  
	        listItemView.title.setText((String) listItems.get(position)  
	                .get("title"));  
	        listItemView.price.setText((String) listItems.get(position)  
	                .get("price"));  
	        return convertView; 
	    }  
	    /** 
	     *  
	     * @param urlStr 所需要加载的图片的url,以String形式传进来,可以把这个url作为缓存图片的key 
	     * @param image ImageView 控件 
	     * @param resId 默认显示的图片资源
	     */  
	    private void loadBitmap(String urlStr, ImageView image,int resId) {   	
	    	
	    	DisplayImageOptions options = new DisplayImageOptions.Builder()
	    	        .showImageOnLoading(R.drawable.default_ico) // 设置图片在下载期间显示的图片
	    	        .showImageForEmptyUri(R.drawable.default_ico)// 设置图片Uri为空或是错误的时候显示的图片  
	    	        .showImageOnFail(R.drawable.default_ico)// 设置图片加载/解码过程中错误时候显示的图片  
	    	        .resetViewBeforeLoading(true)  // default
	    	        .delayBeforeLoading(1000)
	    	        .cacheInMemory(true)//设置下载的图片是否缓存在内存中  
	    	        .cacheOnDisk(true)  //设置下载的图片是否缓存在SD卡中  
	    	       // .postProcessor(null)//在图片显示之前的操作
	    	        //.preProcessor(null) //设置图片加入缓存前,对bitmap进行设置   
	    	        .extraForDownloader(null)
	    	        .considerExifParams(false) // default
	    	        .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default
	    	        .bitmapConfig(Bitmap.Config.ARGB_8888) // default
	    	      //  .decodingOptions(null)
	    	        .displayer(new SimpleBitmapDisplayer()) // default
	    	        .displayer(new RoundedBitmapDisplayer(20))//是否设置为圆角,弧度为多少  
	    	        //.displayer(new FadeInBitmapDisplayer(100))//最好不添加会出现闪烁的情况
	    	        .handler(new Handler()) // default
	    	        .build();
	    	
	    	//返回一个实例
	    	ImageLoader imageLoader = ImageLoader.getInstance();
	    	//ImageAware imageAware = new ImageViewAware(image, false);
	    	//imageLoader.displayImage(urlStr,image,options);
	    	//ImageSize targetSize = new ImageSize(150, 150); // result Bitmap will be fit to this size
	    	//image.setImageBitmap(imageLoader.loadImageSync(urlStr, targetSize, options));//同步加载
	    	imageLoader.displayImage(urlStr, image, options, new SimpleImageLoadingListener() {
	    	    @Override
	    	    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
	    	        // Do whatever you want with Bitmap
	    	    	Log.v("catch",view+"");
	    	    	try{
	                if (loadedImage != null && view!=null) {  
	                    ImageView imageView = (ImageView) view;  
	                   // imageView.setImageBitmap(loadedImage);
	                    // 是否第一次显示  
	                    boolean firstDisplay = !displayedImages.contains(imageUri);  
	                    if (firstDisplay) {  
	                        // 图片淡入效果  
	                        FadeInBitmapDisplayer.animate(imageView, 800);  
	                        displayedImages.add(imageUri);  
	                    } 
	                } 
	    	    	}catch(Exception e){
	    	    		Log.v("catch1",e.getMessage());
	    	    	}
	    	    }
	    	});
	    }  
}

下面是HomeActivity.java

package com.demo.jiuwo.ui;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;


import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.baidu.android.pushservice.PushConstants;
import com.baidu.android.pushservice.PushManager;

import com.demo.adapter.GridViewAdapter;
import com.demo.adapter.HomeGoodsListViewAdapter;
import com.demo.jiuwo.BaseActivity;
import com.demo.jiuwo.R;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.Display;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.ViewGroup.MarginLayoutParams;
import android.view.WindowManager;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ImageSwitcher;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.RadioButton;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView.OnItemClickListener;

public class HomeActivity extends BaseActivity {
	protected WebView webview;
	private boolean okload;//标记是否可以加载
	protected ListView goodslistview;
	private ScrollView mScrollView;
	protected TextView loading;
	protected  ArrayList<Map<String, Object>> goodslistItems; //产品列表
	private HomeGoodsListViewAdapter goodslistviewadapter;   //产品适配器
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		okload=true;
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_home);
	
		goodslistview = (ListView) findViewById(R.id.goodslist);
		mScrollView= (ScrollView) findViewById(R.id.scrollid);
		loading= (TextView) findViewById(R.id.loading);
		initListener();
	    //后台请求产品列表
		loaddata();
	}
	private void loaddata(){
		new Thread(new Runnable() {
			public void run() {
				okload=false;
			      runOnUiThread(new Runnable() {
						@Override
						public void run() {
							// TODO Auto-generated method stub
				    	    loading.setVisibility(View.VISIBLE);
						}  
			          }); 
				
				try{
					boolean firstload=false;
					int count=0;
					if(goodslistviewadapter == null){
						firstload=true;
						 goodslistviewadapter = new HomeGoodsListViewAdapter(HomeActivity.this); //创建适配器 
					}else{
						 count = goodslistviewadapter.getCount(); 
					}
				    //后台请求产品列表
						// TODO Auto-generated method stub
				       
			           	String jsonstr=getUrlPage("填写上你自己的json地址");
			           	if(jsonstr!=""){
			            try{
			            	
			        		JSONArray jsonarr= new JSONObject(jsonstr).getJSONArray("goods_list");   
			                for(int i = 0; i < jsonarr.length() ; i++){ 
			                    JSONObject jsonObj = ((JSONObject)jsonarr.opt(i)); 
			                    int id = jsonObj.getInt("id"); 
			                    String pic = jsonObj.getString("pic"); 
			                    String title = jsonObj.getString("title");
			                    String price = jsonObj.getString("price");
			                    Map<String, Object> map = new HashMap<String, Object>(); 
			                    map.put("pic", pic); 
			                    map.put("title", title);  
			                    map.put("price", price);  
			                    map.put("id", id);    
			                    if(!map.isEmpty()){
			    					 goodslistviewadapter.addItem(map);
			    				}
			                   
			                }
			                if(firstload){
					    	    runOnUiThread(new Runnable() {
									@Override
									public void run() {
										// TODO Auto-generated method stub
										goodslistview.setAdapter(goodslistviewadapter);
									}	
					    	    });
			                }
			                Log.v("adapter_count",goodslistviewadapter.toString());

                            // 发送消息  
                            handler.sendMessage(handler.obtainMessage(100,  
                                    null));
			                //goodslistview.setSelection(lastItem - 1);
			                
			            }catch(JSONException e){
			            	Log.v("json_err",e.getMessage());
			            }
			           	}else{
					    	  Toast.makeText(getApplicationContext(), "已经没有内容啦!",
										Toast.LENGTH_SHORT).show();
			           	}

			                
					}catch(Exception e){
						Log.v("json_err",e.getMessage());
					}			
			}
		}).start();

	}
	
	//动态设置listview的高度
	public void setListViewHeightBasedOnChildren(ListView listView) {     
        // 获取ListView对应的Adapter     
		ListAdapter listAdapter = listView.getAdapter();  
	    if (listAdapter == null) { 
	        return; 
	    } 
	    int totalHeight = 0; 
	    for (int i = 0; i < listAdapter.getCount(); i++) { 
	        View listItem = listAdapter.getView(i, null, listView); 
	        listItem.measure(0, 0); 
	        totalHeight += listItem.getMeasuredHeight(); 
	    } 

	    ViewGroup.LayoutParams params = listView.getLayoutParams(); 
	    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount()-1)); 
	    ((MarginLayoutParams)params).setMargins(10, 10, 10, 10);
	    listView.setLayoutParams(params); 
    }  
	/**
	 * 初始化事件绑定
	 **/
	private void initListener(){
	    goodslistview.setOnItemClickListener(new OnItemClickListener(){
			@Override
			//arg0:就是你的listview   arg2:点击的item的位置。和你的数组的下标相等。arg3:被电击view的id
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				// TODO Auto-generated method stub
	               // TODO Auto-generated method stub
				try{
				Map<String, Object> map=goodslistItems.get(arg2);
				String titleitem=map.get("id").toString();	
				

					Intent intent=new Intent();
					Bundle bundle=new Bundle();
					bundle.putString("goodsid",titleitem);
					intent.putExtras(bundle);
					intent.setClass(HomeActivity.this,GoodsActivity.class);
					startActivity(intent);
					finish();
					inright();
				}catch(Exception e){
					e.printStackTrace();
				}
			}
             
        }); 
		//scrollview滚动到底部监听
		mScrollView.setOnTouchListener(new OnTouchListener(){

			@Override
			public boolean onTouch(View arg0, MotionEvent arg1) {
				// TODO Auto-generated method stub
		          switch (arg1.getAction()) {
		            case MotionEvent.ACTION_DOWN:
		 
		                break;
		            case MotionEvent.ACTION_MOVE:
		                 int scrollY=arg0.getScrollY();
		                 int height=arg0.getHeight();
		                 int scrollViewMeasuredHeight=mScrollView.getChildAt(0).getMeasuredHeight();
		                 if(scrollY==0){
		                        System.out.println("滑动到了顶端 view.getScrollY()="+scrollY);
		                    }
		                 if((scrollY+height)==scrollViewMeasuredHeight){
		                        System.out.println("滑动到了底部 scrollY="+scrollY);
		                        System.out.println("滑动到了底部 height="+height);
		                        System.out.println("滑动到了底部 scrollViewMeasuredHeight="+scrollViewMeasuredHeight);
		                        if(okload){
		                        loaddata();
		                        }
		                 }
		                break;
		 
		            default:
		                break;
		            }
				return false;
			}
			
		});
	}
    private Handler handler = new Handler() {  
        public void handleMessage(android.os.Message msg) { 
            //通知listview更新界面
            goodslistviewadapter.notifyDataSetChanged();
        	loading.setVisibility(View.GONE);
        	setListViewHeightBasedOnChildren(goodslistview);
        	okload=true;//可以再次加载
        };  
    };  
}



微信号:kelicom QQ群:215861553 紧急求助须知
Win32/PHP/JS/Android/Python