1. 程式人生 > >listview優化和bitmap簡單使用

listview優化和bitmap簡單使用

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因為是雙層迴圈

          }
        }