Android Adapter之BaseAdapter

系统 1324 0



 1.概念

Adapter英文意思 适配器

 

Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的View(ListView,GridView)等地方都需要用到Adapter。如下图直观的表达了Data、Adapter、View三者的关系:


Android Adapter之BaseAdapter
 (盗图可耻,但是很直观)


Android Adapter之BaseAdapter
 

我们可以看到在Android中与Adapter有关的所有接口、类的完整层级图。在我们使用过程中可以根据自己的需求实现接口或者继承类进行一定的扩展。比较常用的有 BaseAdapter,ArrayAdapter,SimpleCursorAdapter等。

  • BaseAdapter 是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性;
  • ArrayAdapter 支持泛型操作,通常需要实现getView方法,特殊情况下(结合数据row id),为了让ui事件相应处理方便点最好重写getItemId;
  • SimpleCursorAdapter 可以适用于简单的纯文字型ListView,它需要Cursor的字段和UI的id对应起来。如需要实现更复杂的UI也可以重写其他方法。

 

 

BaseAdapter的所有接口:


Android Adapter之BaseAdapter
最常用的有 getView() ,它是将获取数据后的View组件返回,如ListView中每一行里的TextView、Gallery中的每个ImageView。

getItemId() ,返回数据的id

getItem() ,将获取数据的某个位置的数据返回 如array[0],array[1].....

getCount() 将获取数据的个数返回

 

BaseAdapter 是一个 抽象类 如果使用我们必须自己去实现

下边引用一个例子:


Android Adapter之BaseAdapter
 我用了4个插件Spinner,ListView ,Gallery,GridView

 

 

      package com.example.fouradpater_2;

import android.os.Bundle;
import android.provider.MediaStore.Images;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.Spinner;
import android.widget.SpinnerAdapter;
import android.widget.TextView;

public class MainActivity extends Activity {
	//作为一个adapter用于转换的“过渡”view
	private LayoutInflater mInflater;
	//定义一个数组用来存放数据
	private static final String[] mad = {"4","3","2","1"};
	//定义四个插件
	private Spinner mSpinner;
	
	private GridView mGridView;
	
	private Gallery mGallery;
	
	private ListView mListView;
	//定义一个adapter
	private Adapter mAdapter;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//		mInflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//		mInflater = (LayoutInflater)MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		
		//关联四个组件
		mSpinner = (Spinner) findViewById(R.id.spinner1);
		mGridView = (GridView) findViewById(R.id.gridView1);
		mGallery = (Gallery) findViewById(R.id.gallery1);
		mListView = (ListView) findViewById(R.id.listView1);
		//new一个 Adapter 的 BaseAdapter
		mAdapter = new BaseAdapter() {
			
			@Override
			//最常用的有getView(),它是将获取数据后的View组件返回,
			//如ListView中每一行里的TextView、Gallery中的每个ImageView。
			public View getView(int position, View convertView, ViewGroup parent) {
				// TODO Auto-generated method stu

				TextView text;
				ImageView imgview;
				RelativeLayout rLayout;
				 if (convertView == null) {
					 rLayout = (RelativeLayout) mInflater.inflate(R.layout.new_file, parent, false);
//					 view = new TextView(MainActivity.this);
			        } else {
			        	rLayout = (RelativeLayout) convertView;
			        }
				String item = (String) getItem(position);
//				rLayout.setTag(item.toString());
				text = (TextView) rLayout.findViewById(R.id.TextView2);
//				text.setText(item.toString());   画蛇添足
				text.setText(item);
				
				imgview = (ImageView) rLayout.findViewById(R.id.ImageView1);
//				imgview.setId(R.drawable.ic_launcher);// 用错函数
				
				imgview.setImageResource(R.drawable.ic_launcher);
				
				
				return rLayout;
			}
			
			@Override
			//getItemId(),返回数据的id
			public long getItemId(int position) {
				return position;
			}
			
			@Override
			//getItem(),将获取数据的某个位置的数据返回 如array[0],array[1].....
			public Object getItem(int position) {
				return  mad[mad.length-1-position];
			}
			
			@Override
			//getCount()将获取数据的个数返回
			public int getCount() {
				
				return mad.length;
			}
		};

	
		mSpinner.setAdapter((SpinnerAdapter) mAdapter);
		mGridView.setAdapter((ListAdapter) mAdapter);
		mGallery.setAdapter((SpinnerAdapter) mAdapter);
		mListView.setAdapter((ListAdapter) mAdapter);
	}
		
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

    

 

记录下自己的错误,顺便做下记录和介绍

使用BaseAdapter ,必须将最基础的4个函数完善

      <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">
    
    <ImageView
        android:id="@+id/ImageView1"
        android:layout_width="20dp"
        android:layout_height="20dp"
        
        />
    <TextView 
        android:id="@+id/TextView2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/ImageView1"
        
        />
</RelativeLayout>
    

 这是BaseAdapter需要用到的xml,算是一个“过渡”的xml,用来给getView传递View

 

 

所以BaseAdapter比较万能,可以将各种储存结构通过Adapter 传递给需要的View

Android Adapter之BaseAdapter


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论