viewHolder 和convertview优化:
public class Maingvadapter extends BaseAdapter {
private List mlist;
private Context mcontext;
private LayoutInflater mLayoutinflater;
public Maingvadapter(Context context, List list) {
mcontext = context;
mlist = list;
}
@Override
public int getCount() {
return mlist.size();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
viewHolder holder = null;
if (convertView == null) {
holder = new viewHolder();
mLayoutinflater = LayoutInflater.from(mcontext);
convertView = mLayoutinflater.inflate(R.layout.imagelist_item, parent, false);
//设置一个布局
// ImageView imageView=new ImageView(mcontext);
holder.mimageView = (ImageView) convertView.findViewById(R.id.image);
convertView.setTag(holder);
Log.d("调用Adapter", "ddd");
} else {
holder = (viewHolder) convertView.getTag();
}
holder.mimageView.setBackgroundColor(Color.BLACK);
Log.d("设置颜色了", "ddd");
holder.mimageView.setImageBitmap((Bitmap) mlist.get(position));
return convertView;
}
@Override
public Object getItem(int position) {
return mlist.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
//viewHolder的成员根据布局文件中的成员决定
public final class viewHolder {
public ImageView mimageView;
}
}
gridview:设置横竖间距 space...
gridveiw:通过改变Imageview大小可以改变所占位置。
g'ridview设置监听setOnItemClickListener,通常情况下都要用到前面List<>获取(position)
详细说明Listview的特殊需求和优化处理:
当发生个别项和整体项不同的情况下。做特殊项返回处理的时候(例如在listview中添加了标签),需要注意convertview也同时缓存的特殊项,这时就可能造成空指针异常。
另外由于标签的加入position和listview的顺序就可能混乱。这样返回的list中的项也需要判断处理,所以这个处理的方法写在getItem()中
代码如下:
//缓存的信息不仅有正常的还有标签所以要去掉标签
apkviewHolder holder=new apkviewHolder();
//下面第二个条件是去掉标签获取Tag缓存的关键!根布局是我们自己写的Item布局如果包含说明不是标签项
if(convertView!=null&&convertView instanceof RelativeLayout){
holder= (apkviewHolder)convertView.getTag();
}
else {
LayoutInflater inflater=LayoutInflater.from(getApplicationContext());
convertView = inflater.inflate(R.layout.apklv_item,null);
holder.apkname= (TextView) convertView.findViewById(R.id.apksize_tv);
holder.apkpic= (ImageView) convertView.findViewById(R.id.apk_pic);
convertView.setTag(holder);
}
holder.apkname.setText(getItem(position).getApkname());
holder.apkpic.setImageDrawable(getItem(position).getApkpicture());
重写getItem方法:
/**
* 在外部可以掉用集合绑定的adapter 从而重复回调这个方法!
* 这个方法解决项数和list 不匹配的问题
* @param position//和上面方法的最后两行相互联系,共同完成给view装载。
* @return 返回一个list中的一个匹配项
*/
public ApkBean getItem(int position) {
ApkBean itemApkBeam=null;
if(position<nomalApklist.size()){
itemApkBeam =nomalApklist.get(position);
} else {
itemApkBeam=sysApkList.get(position-1-nomalApklist.size());
}
return itemApkBeam;
}
在外部调用getItem方法可以通过Listview.getItemAtposion() 内部通过获取绑定的Adapter 回调getItem方法():
ApkBean apkBean= (ApkBean) apklv.getItemAtPosition(position);
Listview 的addHeaderView方法:
使用这个方法
1. 需要将所添加的布局从和listview控件平级的空间中单独移除,
2.直接把该布局添加上即可,布局内的数据初始化不变,否则会发生:如下异常
java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams
PopupWindow:一定要设置背景颜色!!构造函数第一个是布局。设置位置需要一个view。 设置位置时可以根据view获取位置信息(view.getloctionOnScreen(数组))放到长度为2的数组中进行设置。
Bitmap的创建和分割方面:
Bitmap创建:通过BitMapFactory....
分割就是截取: 通过已有的Bitmap 在上面挖取新的bitmap, 这里我们要将一整张图片分割所以获取左上角位置用了一个双层循环。
调整图片的大小用Matrix,和Bitmap整一起就行了。
Bitmap bitmap=null;
List<Bitmap> itembitmap=new ArrayList<Bitmap>();
Bitmap chosebitmap= BitmapFactory.decodeResource(context.getResources(),chosepicid);
//type切割的个数
int itemwidth=chosebitmap.getWidth()/type;
int itemheigth=chosebitmap.getHeight()/type;
//核心思想是根据Bitmap方法的切割方式将Bitmap切割成typeXtype个位图。
for(int j=1;j<=type;j++) {
for(int i=1;i<=type;i++) {
//对图片进行诉缩放
Matrix matrix=new Matrix();
matrix.setScale(1f,0.8f);
//根据原位图扣取新位图
bitmap= chosebitmap.createBitmap(chosebitmap,
(i-1)*itemwidth,(j-1)*itemheigth,itemwidth,itemheigth,matrix,false );
itembitmap.add(bitmap);
//注意这里的传入ID因为是双层循环
}
}
最后贴上这次拼图游戏小项目 练习的代码:https://github.com/cuizehui/PintuGame/