您的位置:首页 > 移动开发 > Android开发

Android之BaseAdapter的优雅实现

2015-10-22 18:38 537 查看
在android的开发过程中,我们不可避免的要使用ListView来展示我们的Activity上面的内容。你可以使用很多种方式来实现这一功能,但是如何优雅快速的来实现呢?这就是我要写的了,既为了大家共同进步,也为了以后自己复习方便。话不多说,上代码吧。

首先要在main_activity.xml 文件中写好我们的布局文件其实也就是一个ListView,然后是对于其内每一个Item,我们要展示的布局样式,如item.xml:

"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<ImageView
android:id="@+id/imageview"
android:layout_width="100dp"
android:layout_height="60dp"
android:background="#FFADAD"
android:src="@drawable/ic_launcher" />

<TextView
android:id="@+id/title"
android:layout_width="240dp"
android:layout_height="30dp"
android:layout_toRightOf="@+id/imageview"
android:background="#AAAAAA"
android:text="Title"
android:gravity="center" />

<TextView
android:id="@+id/content"
android:text="Content"
android:layout_width="240dp"
android:layout_height="40dp"
android:layout_below="@+id/title"
android:layout_toRightOf="@+id/imageview"
android:background="#F0000F" />

</RelativeLayout>


然后对应此xml文件,我们需要声明一个bean的方式的java文件,用来封装对应的资源:

package com.example.testproject;

public class ItemBean {

private int ItemImageView;
private String ItemTitle;
private String ItemContent;

public int getItemImageView() {
return ItemImageView;
}
public void setItemImageView(int itemImageView) {
ItemImageView = itemImageView;
}
public String getItemTitle() {
return ItemTitle;
}
public void setItemTitle(String itemTitle) {
ItemTitle = itemTitle;
}
public String getItemContent() {
return ItemContent;
}
public void setItemContent(String itemContent) {
ItemContent = itemContent;
}
public ItemBean(int itemImageView, String itemTitle, String itemContent) {
ItemImageView = itemImageView;
ItemTitle = itemTitle;
ItemContent = itemContent;
}
}
//其中需要注意的是构造函数中含有全部的参数


下面就是BaseAdapter的实现类了,为了代码的复用,我把BaseAdapter封装了起来,方便维护和修改,内部包含三个方式,我最推崇的是没有被注释的那个,代码如下:

package com.example.testproject;

import java.util.List;

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

@SuppressLint("InflateParams") public class MyAdapter extends BaseAdapter {

private List<ItemBean>mList;
private LayoutInflater mInflater;
public MyAdapter(Context context,List<ItemBean> list){
mList=list;
mInflater=LayoutInflater.from(context);
}

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

@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return mList.get(arg0);
}

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

@Override
public View getView(int arg0, View convertView, ViewGroup arg2) {

//Method1:没有用到后面的参数,没有缓存机制每次都是冲更新生成,资源利用度不够高
//      View view =mInflater.inflate(R.layout.item, null);
//      ImageView imageView=(ImageView)view.findViewById(R.id.imageview);
//      TextView title=(TextView)view.findViewById(R.id.title);
//      TextView content=(TextView)view.findViewById(R.id.content);
//      ItemBean bean=mList.get(arg0);
//      imageView.setImageResource(bean.getItemImageView());
//      title.setText(bean.getItemTitle());
//      content.setText(bean.getItemContent());
//      return view;
//Method1 _end;

//普通式:利用了ListView的缓存机制,避免了每次都创建ListView
//      if(convertView==null){
//          convertView=mInflater.inflate(R.layout.item, null);
//      }
//      ImageView imageView=(ImageView)convertView.findViewById(R.id.imageview);
//      TextView title=(TextView)convertView.findViewById(R.id.title);
//      TextView content=(TextView)convertView.findViewById(R.id.content);
//      ItemBean bean=mList.get(arg0);
//      imageView.setImageResource(bean.getItemImageView());
//      title.setText(bean.getItemTitle());
//      content.setText(bean.getItemContent());
//
//      return convertView;
//普通式结束

//文艺式:避免用findViewById()方法
ViewHolder viewHolder;
if(convertView==null){
viewHolder=new ViewHolder();
convertView=mInflater.inflate(R.layout.item, null);
viewHolder.imageView=(ImageView)convertView.findViewById(R.id.imageview);
viewHolder.title=(TextView)convertView.findViewById(R.id.title);
viewHolder.content=(TextView)convertView.findViewById(R.id.content);
convertView.setTag(viewHolder);
}else{
viewHolder=(ViewHolder)convertView.getTag();
}
ItemBean bean=mList.get(arg0);
viewHolder.imageView.setImageResource(bean.getItemImageView());
viewHolder.title.setText(bean.getItemTitle());
viewHolder.content.setText(bean.getItemContent());

return convertView;
}

class ViewHolder{
public ImageView imageView;
public TextView title;
public TextView content;
}

}
//最后的内部类仅仅是第三个方法才会用的到的。


最后就是在MainActivity中添加实现了。代码如下:

package com.example.testproject;

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

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.widget.ListView;

public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List<ItemBean>itemBeanList=new ArrayList<ItemBean>();
for(int i=0;i<=20;i++){
itemBeanList.add(new ItemBean(
R.drawable.ic_launcher,
"Title"+i,"Content"+i*i
));
}
ListView listView=(ListView)findViewById(R.id.listview);
listView.setAdapter(new MyAdapter(this,itemBeanList));
}

}


好了,代码就是这样了,然后看一下程序的效果图吧(界面没有修改,比较难看,望见谅)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: