Android 解决ListView 和 ScrollVi…

ListView 与 ScrollView 同在一界面会导致ListView 显示变形

下面是我的一个实现 步骤:

1、继承LinearLayout,既然会冲突那就不用ListView 改成线性布局做动态布局效果2、继承BaseAdapter ,可以参照一下Android app源码中 Widget 目录下的SimpleAdapter 为前面扩展的LinearLayout做数据。3、模拟数据填充扩展后的BaseAdapter 为扩展后的LinearLayout 加载数据

第一步:新建LinearLayoutForListView 类使其扩展LinearLayout重写以下两个方法:

 

public  LinearLayoutForListView(Context context) {
        
super (context);
    }

    
public  LinearLayoutForListView(Context context, AttributeSet attrs) {
        
super (context, attrs);
   
    }

 

这两个方法可选,不过建议都写上,第一个方法可以让我们通过 编程的方式 实例化出来,第二个方法可以允许我们通过 XML的方式注册 控件,可以在第二个方法里面为扩展的复合组件加属性。为其添加get / set 方法

     public  AdapterForLinearLayout getAdpater() {
        
return  adapter;
    }

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

 

下面是两个类的全部代码,读者可以无须更改直接使用:

LinearLayoutForListView

package  com.terry.widget;

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

public   class  LinearLayoutForListView  extends  LinearLayout {

    
private  AdapterForLinearLayout adapter;
    
private  OnClickListener onClickListener  =   null ;

    

     public   void  bindLinearLayout() {
        
int  count  =  adapter.getCount();
        
for  ( int   =   0 <  count; i ++ {
            View 
=  adapter.getView(i,  null null );

            v.setOnClickListener(
this .onClickListener);
            
if  (i  ==  count  -   1 {
                LinearLayout ly 
=  (LinearLayout) v;
                ly.removeViewAt(
2 );
            }
            addView(v, i);
        }
        Log.v(
" countTAG " ""   +  count);
    }

    
public  LinearLayoutForListView(Context context) {
        
super (context);

    }

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

    }

    

     public  AdapterForLinearLayout getAdpater() {
        
return  adapter;
    }

    

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

    

     public  OnClickListener getOnclickListner() {
        
return  onClickListener;
    }

    

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

}

 

 

 

AdapterForLinearLayout

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  position) {
        
//  TODO Auto-generated method stub
         return  data.get(position);
    }

    @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  position) {
        
//  TODO Auto-generated method stub
         return  position;
    }

    @Override
    
public  View getView( int  position, View convertView, ViewGroup parent) {
        
//  TODO Auto-generated method stub

        convertView  =  mInflater.inflate(resource,  null );
        Map
< String,  ?>  item  =  data.get(position);
        
int  count  =  to.length;
        
for  ( int   =   0 <  count; i ++ {
            View 
=  convertView.findViewById(to[i]);
            bindView(v, 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());
        }
    }
}

 

对应的XML 如下:

 

Android <wbr>解决ListView <wbr>和 <wbr>ScrollView <wbr>共存冲突的问题 Android <wbr>解决ListView <wbr>和 <wbr>ScrollView <wbr>共存冲突的问题
<? xml version="1.0" encoding="UTF-8" ?>
< LinearLayout  xmlns:android ="http://schemas.android.com/apk/res/android"
    android:orientation ="vertical"  android:layout_width ="fill_parent"
    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 >

 

第三步:主页面使用控件并为其设置数据

XML如下:

     < com.terry.widget.LinearLayoutForListView
                        
android:orientation ="vertical"  android:layout_width ="450px"
                        android:layout_height ="fill_parent"  android:id ="@+id/ListView01" >
                     </ com.terry.widget.LinearLayoutForListView >

 

加载数据如下:

lv  =  (LinearLayoutForListView) findViewById(R.id.ListView01);
        
for  ( int   =   0 <   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);
        }

        
final  AdapterForLinearLayout Layoutadpater  =   new  AdapterForLinearLayout(
                
this list, R.layout.test,  new  String[]  " key_name " ,
                        
" value_name "  },  new   int [] R.id.TextView01,
                        R.id.TextView02 });

 

事件操作,并通过下标得到数据源:

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);

 

Tip:get方法是在Layoutadpater 封装的一个通过下标获取相应数据的方法请参考上文。

至此完成。有碰到这个问题的朋友可以试试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值