Android -- ListView (2)

有时候系统提供的Adapter没法知足用户的需求,这就须要用户本身定义本身的Adapter。下面咱们直接经过一个例子来看一下自定义Adapter的用法。java

main.xml文件:android

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
   >
    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
    </ListView>
</RelativeLayout>

cell.xml文件:缓存

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >
   <ImageView
       android:id="@+id/ce_im"
       android:layout_gravity="left"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       />
    <TextView
        android:id="@+id/ce_tv"
        android:layout_width="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_height="wrap_content"
        /> 
</LinearLayout>


上面咱们定义了两个xml文件。主Xml文件中放一个ListView。cell.xml中定义一个ImageView和TextView。ide

下面轮到自定义Adapter的编写了。函数

MyAdapter.java布局

public class MyAdatpter extends BaseAdapter{ 
    /**
     *listView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值获得listView的长度,而后根据这个长度,调用getView()逐一绘制每一行。
     *若是你的getCount()返回值是0的话,列表将不显示一样return 1,就只显示一行。
     */
    private Context context;
    private int[] inStr;
    private String[] data;
                                                                      
    public MyAdatpter(Context context,int[] inStr,String[] data) {
        this.context = context;
        this.inStr=inStr;
        this.data=data;
    }
  //返回一个视图
    @Override
    public View getView(int arg0, View arg1, ViewGroup arg2) {
        //建立Holter
        ViewHolter holter=new ViewHolter();
        //若是缓存arg1为空,则须要建立View
        if (arg1==null) {
            //根据context上下文加载布局
            /**
             * LayoutInflater是用来找layout下xml布局文件而且实例化
             * findViewById()用来在xml布局中找控件id
             */
            arg1=LayoutInflater.from(context).inflate(R.layout.cell, null);
            //加载布局
            holter.p_w_picpathView =(ImageView)arg1.findViewById(R.id.ce_im);
            holter.textView =(TextView)arg1.findViewById(R.id.ce_tv);      
            holter.p_w_picpathView.setImageResource(inStr[arg0]);
            holter.textView.setText(data[arg0]);
            //将设置好的布局保存到缓存中,并将其设置在Tag里,以便后面方便取出Tag
            arg1.setTag(holter);
        }else {        
            holter=(ViewHolter)arg1.getTag();
                                                                              
            holter.p_w_picpathView =(ImageView)arg1.findViewById(R.id.ce_im);
            holter.textView =(TextView)arg1.findViewById(R.id.ce_tv);
                                                                          
            holter.p_w_picpathView.setImageResource(inStr[arg0]);
            holter.textView.setText(data[arg0]);
        }  
        return arg1;
    }
    /**
     *ViewHolder不是Android的API或类,而是一种设计方法,是自定义的一个静态类,缓存一下,免得Listview更新的时候,还要从新操做。
     */
  public static class ViewHolter{
      TextView textView;
      ImageView p_w_picpathView;
                                                                        
  }
 //在此适配器中所表明的数据集中的条目数
    @Override
    public int getCount() {
        return inStr.length;
    }  
   //获取数据集中与指定索引对应的数据项
        @Override
        public Object getItem(int position) {
            return data[position];
        }
    //获取在列表中与指定索引对应的行id
    @Override
    public long getItemId(int position) {
        return position;
    }
}

MainActivity.javathis

 

public class MainActivity extends Activity {
        
    private ListView listView;
    private String[] data={"一号","二号","三号"};
    private int[] p_w_picpathId={R.drawable.bomb1,R.drawable.bomb2,R.drawable.bomb3};
    private MyAdatpter adatpter;   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView=(ListView)findViewById(R.id.lv);
        adatpter=new MyAdatpter(this, p_w_picpathId, data);      
        listView.setAdapter(adatpter);     
    }
}

运行结果:设计

相关文章
相关标签/搜索