listview优化和bitmap简单使用

本文深入探讨了优化GridView与ListView的实现过程,包括ViewHolder与convertView的运用,gridview设置横竖间距、监听及特殊项处理,以及Bitmap的创建与分割等关键技巧。同时介绍了ListView的特殊需求、优化处理方法,如标签加入导致的顺序混乱及如何正确调用getItem方法。此外,还分享了如何使用addHeaderView方法和PopupWindow的正确应用,以及拼图游戏小项目练习代码链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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/



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值