ListView滾動翻頁,Radiobutton實現單選


EditAdapter.java頁面

import java.util.HashMap;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.CompoundButton.OnCheckedChangeListener;

public  class EditAdapter  extends BaseAdapter {
     //  定義一個LayoutInflater來導入資源文件用
    LayoutInflater inflater;
     //  用來接收要綁定的數據
    List<HashMap<String, Object>> aList;
     //  要綁定的資源文件id
     int resID;
     private  int temp = -1;
    Activity activity;
     HashMap<String,Boolean> states= new HashMap<String,Boolean>();
    
     public EditAdapter(Context context, List<HashMap<String, Object>> aList,
             int resId) {
         this.inflater = LayoutInflater.from(context);
         this.aList = aList;
         this.resID = resId;
        activity= (Activity)context;
    }

     //  綁定的數據的長度,也就是ListView項的個數
    @Override
     public  int getCount() {
         //  TODO Auto-generated method stub
         return  this.aList.size();
    }

    @Override
     public Object getItem( int position) {
         //  TODO Auto-generated method stub
         return  null;
    }

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

    @Override
     public View getView( final  int position, View convertView, ViewGroup parent) {
        
        
        Eholder holder;
         if (convertView ==  null) {
            convertView = inflater.inflate(R.layout.editpersonitem,  null);
            holder =  new Eholder();

            
             //  setTag方法用來設置與視圖關聯的標簽,我的理解就是把和它相關的ViewHolder存儲起來,到用的時候再拿出來
            convertView.setTag(holder);
        }  else {
             //  如果不為null就直接通過getTag取出來
            holder = (Eholder) convertView.getTag();
        }
        holder.itemview = (ImageView) convertView.findViewById(R.id.imgperson);
         final RadioButton radio=(RadioButton) convertView.findViewById(R.id.rdoperdson);
        holder.radiobutton = radio;
         //  人物照片
        
//  圖片網絡路徑
        String imageUrl =  this.aList.get(position).get("PhotoUrl").toString();
         //  圖片本地路徑
        String imageName =  this.aList.get(position).get("PhotoName").toString();

         //  縮略圖在本地的路徑
        Bitmap imageBitmap = Utility.getLoacalBitmap(imageName);
         //  如果本地有保存
         if (imageBitmap !=  null) {
            holder.itemview.setImageBitmap(imageBitmap);

        }  else { //  如果本地沒有保存

            imageBitmap = Utility.getNetBitmap(imageUrl);
             if (imageBitmap !=  null) {

                Utility.SaveImage(imageBitmap, imageName);

                holder.itemview.setImageBitmap(imageBitmap);

            }

        }

         //  RadioButton
        holder.radiobutton.setOnClickListener( new View.OnClickListener() {
            
             public  void onClick(View v) {
                 //  TODO Auto-generated method stub
                
                Toast.makeText(activity.getApplicationContext(), "選中的是第"+position+"條記錄", 0).show();
                
                 // 重置,確保最多只有一項被選中
                 for(String key:states.keySet()){
                    states.put(key,  false);
                    
                }
                states.put(String.valueOf(position), radio.isChecked());
                EditAdapter. this.notifyDataSetChanged();
            }
        });

         boolean res= false;
         if(states.get(String.valueOf(position)) ==  null || states.get(String.valueOf(position))==  false){
            res= false;
            states.put(String.valueOf(position),  false);
        }
         else
            res= true;
        
        holder.radiobutton.setChecked(res);
         return convertView;
        
    

    }

     /**
     * 添加數據列表項
     * 
     * 
@param  newsitem
     
*/
     public  void addNewsItem(List<HashMap<String, Object>> newItem) {
         for ( int i = 0; i < newItem.size(); i++) {
            aList.add(newItem.get(i));
        }
    }

}

 

 EditPerson.java頁面

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONObject;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.RadioButton;
import android.widget.Toast;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView.OnItemClickListener;

public  class EditPerson  extends Activity  implements OnScrollListener {
    
     private EditAdapter adapter =  null;
     private  int visibleLastIndex = 0;  //  最后的可視項索引
     private  int visibleItemCount;  //  當前窗口可見項總數
     private  int datasize = 0;  //  數據集的條數
     private Boolean isOver =  false;
     private Handler handler =  new Handler();
     private ListView lv;
     private ArrayList<String> imageNames =  new ArrayList<String>();
     private String useridstring;
     private String imagePath = Environment.getExternalStorageDirectory()
    + "/DCIM/Camera/";
     private String photoDate;
     // private ProgressDialog progressDialog = null;
    
    List<HashMap<String, Object>> aList =  null;
     private ProgressBar circleProgressBar;
     // 彈出窗口
    AlertDialog.Builder dialog =  null;
     // 每滾動一頁顯示多少條數據
     private String pageSize = "5";
     // 第幾頁
     private  int pageIndex = 1;
    
    
     public  void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
        setContentView(R.layout.editperson);
       
         // "上一步"按鈕
        Button btnBack = (Button) findViewById(R.id.btnBack);
         // "新增"按鈕
        Button btnAdd = (Button) findViewById(R.id.btnAdd);
         // "覆蓋"按鈕
        Button btnRe = (Button) findViewById(R.id.btnRe);
        
         // 點"上一步"按鈕跳轉到之前有搜索數據的搜索頁面,不重新加載,並銷毀此頁
        btnBack.setOnClickListener( new View.OnClickListener() {
             public  void onClick(View v) {    
                            
                finish();
            }
        });
        
        dialog =  new AlertDialog.Builder( this);

         //  獲得前面的activity傳來的參數
        Bundle bundle =  new Bundle();
        bundle =  this.getIntent().getExtras();
         //  userid的字符串
        useridstring = bundle.getString("Userid");
        
         //  照片Base64的字符串
        photoDate = bundle.getString("photoString");
        
         //  操作ProgressBar控件
        circleProgressBar = (ProgressBar) findViewById(R.id.circleProgressBar);
        circleProgressBar.setVisibility(View.VISIBLE);
        circleProgressBar.setProgress(0);

        lv = (ListView) findViewById(R.id.lvPerson);
        
         //  啟動一個后台線程
        handler.postDelayed( new Runnable() {
            @Override
             public  void run() {
                
                aList = getData("1",pageSize,useridstring);

                 if (aList ==  null) {

                     //  提示沒有數據
                    dialog.setTitle("提示");
                    dialog.setMessage("無相關照片!");
                    dialog.setPositiveButton("確定",  null);
                    dialog.show();

                }  else {

                     //  這里下載數據
                    adapter =  new EditAdapter(EditPerson. this, aList,
                            R.layout.recognitionitem);
                    lv.setAdapter(adapter);

                }

                circleProgressBar.setVisibility(View.GONE);
            }
        }, 2000);

        lv.setOnScrollListener( this);
        
         //  點"新增"按鈕,存儲圖片到雲端,保存到數據庫
        btnAdd.setOnClickListener( new View.OnClickListener() {
             public  void onClick(View v) {
                 //  保存用戶信息
                 if (!IsSave()) {

                     return;

                }

                
                dialog.setTitle("提示");
                dialog.setMessage("新增成功!");
                dialog.setPositiveButton("確定", new DialogInterface.OnClickListener() {

                    @Override
                     public  void onClick(DialogInterface dialog,
                             int which) {
                        Intent intent =  new Intent(EditPerson. this,
                                Camera. class);
                        startActivity(intent);
                    }
                });
                dialog.show();
            }
        });
        
         //  點"覆蓋"按鈕,先刪除本地手機上緩存里的照片,存儲圖片到雲端,保存縮略圖到數據庫
        btnRe.setOnClickListener( new View.OnClickListener() {
             public  void onClick(View v) {
             // 通過RADIOBUTTON按鈕取得圖片名稱
                String strPicName="";
                 for ( int i = 0, j = lv.getCount(); i < j; i++) {
                     /* View child = lv.getChildAt(i);
                    RadioButton rdobtn = (RadioButton) child.findViewById(R.id.rdoperdson);
                    if (rdobtn.isChecked()) {
                        strPicName = aList.get(i).get("PicName").toString();
                    }
*/
                     if (adapter.states.get(String.valueOf(i))== true)
                    {
                        strPicName = aList.get(i).get("PicName").toString();
                    }
                }
                 if(strPicName=="")
                {
                    dialog.setTitle("提示");
                    dialog.setMessage("請選擇");
                    dialog.setPositiveButton("確定",  null);
                    dialog.show();
                     return;
                }
                 if(!IsCover(strPicName)){
                     return;
                }

                dialog.setTitle("提示");
                dialog.setMessage("覆蓋成功!");
                dialog.setPositiveButton("確定", new DialogInterface.OnClickListener() {

                    @Override
                     public  void onClick(DialogInterface dialog,
                             int which) {
                        Intent intent =  new Intent(EditPerson. this,
                                Camera. class);
                        startActivity(intent);
                    }
                });
                dialog.show();
            
            
                
                
            }
        });
    }
     // 保存圖片
     private  boolean IsSave() {
         //  TODO Auto-generated method stub
        
        
// progressDialog = ProgressDialog.show(SaveUserInfo.this, "請稍等...", "獲取數據中...", true);

        
    

        CallWS callWS =  new CallWS();
        String saveResult = callWS.AddUserPic(photoDate, useridstring);

         if (saveResult.equals("-1")) {
            
             // progressDialog.dismiss();
            
            Alert("保存失敗!");
            
             return  false;
            
        }

         // progressDialog.dismiss();
        
         return  true;

    }
     // 覆蓋圖片
     private  boolean IsCover(String strPicName) {
         //  TODO Auto-generated method stub
        
        
// progressDialog = ProgressDialog.show(SaveUserInfo.this, "請稍等...", "獲取數據中...", true);

        
        
    
        
// 先刪除本地手機上緩存里的照片
        
//  縮略圖在本地的路徑
        File file  =  new File(imagePath+strPicName+ "_thumbnail.jpg");
         // 原始圖在本地路徑
        File filenew  =  new File(imagePath+strPicName+ ".jpg");
         //  如果本地有保存,刪除
         if (file !=  null) {
            file.delete();  


        }
         //  如果本地有保存原始圖,刪除
         if (filenew !=  null) {
            filenew.delete();  


        }

        CallWS callWS =  new CallWS();
        String saveResult = callWS.CoverUserPic(photoDate, useridstring,strPicName);

         if (saveResult.equals("-1")) {
            
             // progressDialog.dismiss();
            
            Alert("保存失敗!");
            
             return  false;
            
        }

         // progressDialog.dismiss();
        
         return  true;

    }
    
     //  定義一個生成數據的方法,因為HashMap的鍵對應的值可能是String或者是資源的ID,所以這里用的是HashMap<String,
    
//  Object>
     private List<HashMap<String, Object>> getData(String pageIndex, String pageSize, String useridstring) {

         try {

            List<HashMap<String, Object>> aList =  new ArrayList<HashMap<String, Object>>();

             //  獲得識別的圖片列表
            CallWS callWS =  new CallWS();
            String photoInfos = callWS.GetPhotoListByUserid(pageIndex,pageSize,useridstring);

             //  String photoInfos=
            
//  "{\"code\":1,\"totalNum\":1,\"data\":[{\"URL\":\" http://192.169.0.8/webServices1/Photo//03521501-EA4D-4962-B12F-618A3A39F43B_3.jpg \",\"face\":\"\",\"imageName\":\"240E7856-C2F7-4381-B9B1-AE8F3A787890_1\",\"similiar\":0.8389}]}";

             if (photoInfos== null || photoInfos.length() == 0) {

                 return  null;

            }

            JSONObject obj =  new JSONObject(photoInfos);
            String returnCode = obj.get("code").toString();
             if (returnCode.equals("-1")) {
                 return  null;
            }

            datasize = Integer.parseInt(obj.get("total").toString());

            JSONArray numberList = obj.getJSONArray("data");
             for ( int i = 0; i < numberList.length(); i++) {
                 //  System.out.println(numberList.getJSONObject(i).getString("name"));
                HashMap<String, Object> map =  new HashMap<String, Object>();
                String PhotoName = numberList.getJSONObject(i).getString(
                "PhotoName");
                String PhotoUrl = numberList.getJSONObject(i).getString(
                "PhotoUrl");
                String strid = numberList.getJSONObject(i).getString("ID");

                map.put("PhotoUrl", PhotoUrl);
                map.put("id", strid);
                map.put("PhotoName", imagePath+PhotoName+ "_thumbnail.jpg");
                map.put("PicName", PhotoName);
                aList.add(map);

                imageNames.add(numberList.getJSONObject(i).getString(
                        "PhotoName"));
            }

             return aList;

        }  catch (Exception e) {

             return  null;

        }

    }
    
    @Override
     public  void onScroll(AbsListView view,  int firstVisibleItem,
             int visibleItemCounts,  int totalItemCount) {
         //  TODO Auto-generated method stub
        visibleItemCount = visibleItemCounts;
        visibleLastIndex = firstVisibleItem + visibleItemCount;

         //  如果所有的記錄選項等於數據集的條數,則移除列表底部視圖
         if (totalItemCount >= datasize&& datasize > 0) {
             /*
             * listView.removeFooterView(loadMoreView); Toast.makeText(this,
             * "數據全部加載完!", Toast.LENGTH_LONG).show();
             
*/
            isOver =  true;

        }

    }
    
    @Override
     public  void onScrollStateChanged(AbsListView view,  int scrollState) {
         //  數據集最后一項的索引
         int itemsLastIndex = adapter.getCount() - 1;
         int lastIndex = itemsLastIndex + 1;
         if (scrollState == OnScrollListener.SCROLL_STATE_IDLE
                && visibleLastIndex == lastIndex && !isOver) {

             //  如果是自動加載,可以在這里放置異步加載數據的代碼
            
//  lv.addFooterView(btnMore);  // 設置列表底部視圖

            
//  btnMore.setText("正在加載中...");  //  設置按鈕文字

            circleProgressBar.setVisibility(View.VISIBLE);
            circleProgressBar.setProgress(0);

            handler.postDelayed( new Runnable() {

                @Override
                 public  void run() {
                    loadMoreData();
                    adapter.notifyDataSetChanged();
                    circleProgressBar.setVisibility(View.GONE);

                     //  btnMore.setText("查看更多...");  //  恢復按鈕文字
                    
//  lv.removeFooterView(btnMore);
                }
            }, 2000);

        }
    }

     private  void Alert(String info) {

        dialog.setTitle("提示");
        dialog.setMessage(info);
        dialog.setPositiveButton("確定",  null);
        dialog.show();

    }
     /**
     * 加載更多數據
     
*/
     private  boolean loadMoreData() {
         //  獲得當前頁面的頁數
        pageIndex++;

        List<HashMap<String, Object>> aList = getData(Integer.toString(pageIndex), 
                pageSize, useridstring);

         if (aList ==  null) {
            pageIndex--;
             return  false;

        }

        adapter.addNewsItem(aList);

         return  true;

    }

}

 

 XML頁面 

 editperson.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" 
    android:gravity="center_horizontal">

<ProgressBar android:layout_width="wrap_content"
        android:id="@+id/circleProgressBar" android:layout_height="wrap_content"></ProgressBar>

    <ListView
        android:id="@+id/lvPerson"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/linearLayout1" 
        android:layout_alignParentTop="true">
        
    </ListView>
    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true">

        <Button
            android:id="@+id/btnBack"
            android:layout_width="90dp"
            android:layout_height="wrap_content"
            android:text="上一步" />

        <Button
            android:id="@+id/btnAdd"
            android:layout_width="90dp"
            android:layout_height="wrap_content"
            android:text="新增" />

        <Button
            android:id="@+id/btnRe"
            android:layout_width="90dp"
            android:layout_height="wrap_content"
            android:text="覆蓋" />

    </LinearLayout>

</RelativeLayout>

 

 

editpersonitem.xml頁面

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent">
    
   <LinearLayout 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/imgperson"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginLeft="20dip" />

    <RadioButton
        android:id="@+id/rdoperdson"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="100dip"/>
        
     </LinearLayout>
     

</RelativeLayout> 

 

已經調試通過,避免空指針 

 java.lang.NullPointerException 錯誤 ,網上之前找的給Radiobutton 設置ID為position的方法,兩種都嘗試過,都會再不同情況出現空指針錯誤

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM