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的方法,两种都尝试过,都会再不同情况出现空指针错误

 

 

你可能感兴趣的:(RadioButton)