Android ListView嵌套ListView、滚动刷新数据

本文介绍如何在Android应用中实现ListView的嵌套显示,通过自定义Adapter的方式展示复杂的层级数据结构,并提供收支明细等具体场景的实现案例。

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

       

       在Android开发中,咱们常用到的API中ListView就是其中之一,其在有限的手机屏幕上友好的展示数据提供了很好的功能,包括列表展示数据,及滚动分页展示数据,在界面上如果不需要ListView互相嵌套,那么使用就很简单,如:

    //context :界面容器对象

    //new ArrayList<Map<String,Object>>() :需要展示的数据集合

    //R.layout.layout_name 数据项展示列表xml界面

    //new String[]{}  :绑定数据字段名称

    //new int[]{} :需要绑定的空间ID名称

    SimpleAdapter  simpleAdapter= new SimpleAdapter  (context,new ArrayList<Map<String,Object>>(), R.layout.layout_name, new String[]{},new int[]{});

    ListView listView=new ListView();

    listView.setAdapter(simpleAdapter); 

    效果图展示链接:http://sj.qq.com/myapp/detail.htm?apkName=opt.ls.liveSteward        


   如果某页面数据展示较为复杂,需要嵌套ListView才可展示出来,总的思路就是 在adapter中的getView方法中再次使用 嵌套的adaper来绑定数据展示子ListView信息,如:

   /**
     * @Description TODO(父明细展示适配器)
     * @author 
     * @Date 2014-7-1 11:03:43
     *
     */
    private class  BalancePayAdapter  extends SimpleAdapter{
    //获取收支详细记录信息
    List<Map<String,Object>> dataDetails;
    LayoutInflater mInflater;
    Context context;
    ListViewInScrollView listViewDetail;
    private TextView  balance_pay_year_lable;
    private TextView  pay_amount_total_title;
    private TextView  pay_number_title;
    private TextView  income_amount_total_title;
    private TextView  income_number_title;
    private TextView  balance_pay_year;
    private TextView  balance_pay_month;
    private TextView  balance_pay_day;
    private LinearLayout pay_id_lin_LinearLayout;
    private LinearLayout income_id_lin_LinearLayout;
public BalancePayAdapter(Context context,
List<? extends Map<String, ?>> data, int resource,
String[] from, int[] to) {
super(context, data, resource, from, to);
this.context=context;
this.mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.dataDetails=(List<Map<String, Object>>) data;
}
/**
* @Description TODO(收支详细记录信息)
* @param dataDetail
*/
public void setDataDetails(List<Map<String,Object>> dataDetails){
this.dataDetails=dataDetails;
}
@Override
public View getView (int position, View convertView, ViewGroup parent) {
if(convertView==null){
 convertView = mInflater.inflate(R.layout.listview_balance_pay_item, null); 
}


//设置收支日期
balance_pay_year=(TextView) convertView.findViewById(R.id.balance_pay_year);
balance_pay_month=(TextView) convertView.findViewById(R.id.balance_pay_month);
balance_pay_day=(TextView) convertView.findViewById(R.id.balance_pay_day);

//设置某天支出总额
pay_amount_total_title=(TextView) convertView.findViewById(R.id.pay_amount_total_title);
//设置某天支出笔数
pay_number_title=(TextView) convertView.findViewById(R.id.pay_number_title);
//设置某天收入总额
income_amount_total_title=(TextView) convertView.findViewById(R.id.income_amount_total_title);
//设置某天收入笔数
income_number_title=(TextView) convertView.findViewById(R.id.income_number_title);
balance_pay_year_lable=(TextView) convertView.findViewById(R.id.balance_pay_year_lable);

listViewDetail=(ListViewInScrollView)convertView.findViewById(R.id.balance_pay_detail_view);
if(null!=dataDetails&&!dataDetails.get(position).isEmpty())
   {       Map mainMapData= dataDetails.get(position);
           String balancePayRemark=PMSUtil.isNull(mainMapData.get("balancePayRemark"));
           //获取当年年份
           String currentYear=DateTimeUtil.formatDate8(new Date());
           String queryDate=PMSUtil.isNull(mainMapData.get("balance_pay_date"));
           String[] yearMonthDay=new String[]{"XXXX","XX","XX"};
           if(null!=queryDate&&!"".equals(queryDate)){
            yearMonthDay=queryDate.split("-");
           }
              /**
               * 
               * 开始设置实际内容
               */
           if(currentYear.equals(yearMonthDay[0])){
              balance_pay_year.setVisibility(View.GONE);
              balance_pay_year_lable.setVisibility(View.GONE);
           }
           balance_pay_year.setText(PMSUtil.isNull(yearMonthDay[0]));
           balance_pay_month.setText(PMSUtil.isNull(yearMonthDay[1]));
           balance_pay_day.setText(PMSUtil.isNull(yearMonthDay[2]));
           
   pay_amount_total_title.setText(PMSUtil.isNull(mainMapData.get("pay_amount_total")));
   String pay_number=PMSUtil.isNull(mainMapData.get("pay_number"));
   pay_number_title.setText(pay_number);
   if(pay_number==null||"".equals(pay_number)||(Constant.REMARK_KEY_VALUE.equals(balancePayRemark)&&"1".equals(pay_number))){
    pay_id_lin_LinearLayout=(LinearLayout) convertView.findViewById(R.id.pay_id_lin);
    pay_id_lin_LinearLayout.setVisibility(View.GONE);
   }
  
   income_amount_total_title.setText(PMSUtil.isNull(mainMapData.get("income_amount_total")));
   String income_number=PMSUtil.isNull(mainMapData.get("income_number"));
   income_number_title.setText(income_number);
   income_id_lin_LinearLayout=(LinearLayout) convertView.findViewById(R.id.income_id_lin);
   if(income_number==null||"".equals(income_number)||"0".equals(income_number)){   
    income_id_lin_LinearLayout.setVisibility(View.GONE);
   }else{
    income_id_lin_LinearLayout.setVisibility(View.VISIBLE);
   }
   

        String[] from=new String[]{"id","create_date","amount","income_model","remark","thumbnail_path"};
int[] to=new int[]{R.id.incomeId,R.id.create_date_title,R.id.amount_title,R.id.income_model_title,R.id.remark_title,R.id.image_uri_path_title};
//获取收支详细记录信息
    List<Map<String,Object>> dataDetail=(List<Map<String, Object>>) mainMapData.get("datas");
    BalancePayDetailAdapter balancePayDetailAdapter = new BalancePayDetailAdapter(position,context, (dataDetail==null?new          ArrayList<Map<String,Object>>():dataDetail), R.layout.listview_balance_pay_detail_item, from, to);
   
   
    listViewDetail.setOnItemClickListener(new BalancePayDetailOnItemClickListener());           
           listViewDetail.setAdapter(balancePayDetailAdapter);
           
   }
  return convertView;
}

/**
* @Description TODO(收支详细ListView选择事件)
* @author
*
*/
private class BalancePayDetailOnItemClickListener implements OnItemClickListener{


@Override
public void onItemClick(AdapterView<?> adapter, View view, int position,
long arg3) {
  ListView lView=(ListView)adapter;//adapter其实就是ListView
 ImageView imageView= (ImageView) view.findViewById(R.id.image_uri_path_title);
 Bitmap bitmap=imageView.getDrawingCache();
 
  if(R.id.deleteIncomeRecord==view.getId()){
  //点击了删除按钮
  Map<String,Object> map=(Map<String, Object>) lView.getItemAtPosition(position);
  if(incomeRecordService==null){
  incomeRecordService=new IncomeRecordServiceImpl(context);
  }
  try {
Map msg=incomeRecordService.deleteIncomeRecordInfo(map);
if( Constant.MSG_RESULT_TRUE.equals(msg.get(Constant.MSG_RESULT_CODE))){
   if(!bitmap.isRecycled()){
 bitmap.recycle();
   }
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
  }

}

}
      }




      /**
     * @Description TODO(子明细适配器)
     * @author 
     *
     */
    private class  BalancePayDetailAdapter  extends SimpleAdapter{
    //获取收支详细记录信息
    List<Map<String,Object>> dataDetails;
    LayoutInflater mInflater;
    private TextView create_date_view;
    private TextView amount_view;
    private TextView income_model_view;
    private TextView remark_view;
    private ImageView image_uri_path_view;
    private ImageButton deleteIncomeRecord;
    private Bitmap bmp;
    private int positionParent;


    private Context context;
public BalancePayDetailAdapter(int position,Context context,
List<? extends Map<String, ?>> data, int resource,
String[] from, int[] to) {
super(context, data, resource, from, to);
this.context=context;
this.dataDetails=(List<Map<String, Object>>) data;
this.mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.positionParent=position;
}
@Override
public View getView (int position, View convertView, ViewGroup parent) {
if(convertView==null){
 convertView = mInflater.inflate(R.layout.listview_balance_pay_detail_item, null); 
}
if(null!=dataDetails&&!dataDetails.get(position).isEmpty())
   {       
Map mainMapData= dataDetails.get(position);
  
create_date_view=(TextView) convertView.findViewById(R.id.create_date_title);
amount_view=(TextView) convertView.findViewById(R.id.amount_title);
income_model_view=(TextView) convertView.findViewById(R.id.income_model_title);
remark_view=(TextView) convertView.findViewById(R.id.remark_title);
image_uri_path_view=(ImageView) convertView.findViewById(R.id.image_uri_path_title);
deleteIncomeRecord=(ImageButton) convertView.findViewById(R.id.deleteIncomeRecord);
deleteIncomeRecord.setOnClickListener(new DeleteBalancePayRecordOnClickListener(position));
create_date_view.setText(PMSUtil.isNull(mainMapData.get("create_date")));
amount_view.setText(PMSUtil.isNull(mainMapData.get("amount"))+getResources().getString(R.string.rmb));
//income_model_view.setText(Constant.getIncomeModelValue(PMSUtil.isNull(mainMapData.get("income_model"))));
income_model_view.setText(PMSUtil.isNull(mainMapData.get("project_name")));
String income_model=PMSUtil.isNull(mainMapData.get("income_model"));
if(Constant.incomeModel[0].equals(income_model)){
//支出
amount_view.setTextColor(getResources().getColor(R.color.lightred));

}else if(Constant.incomeModel[1].equals(income_model)){
//收入
amount_view.setTextColor(getResources().getColor(R.color.lightblue));

}

remark_view.setText(PMSUtil.isNull(mainMapData.get("remark")));
image_uri_path_view.setOnClickListener(new ImageViewOnClickListener(position));
String image_uri_path=PMSUtil.isNull(mainMapData.get("thumbnail_path"));
if(image_uri_path!=null&&!"".equals(image_uri_path)&&!"null".equals(PMSUtil.isNull(image_uri_path))){
    try {    
//BitmapFactory.Options options = new BitmapFactory.Options();
//options.inSampleSize = 1;
//bmp = BitmapFactory.decodeFile(image_uri_path, options);
// bmp=OptimizeImage.decodeSampledBitmapFromFile(image_uri_path, 100, 100);
// image_uri_path_view.setImageBitmap(bmp);
   
    if(imageThreadNum<sysNum){
    //子线程异步加载图片数据
        new MyLoadImageThread(image_uri_path_view,image_uri_path).start();
        imageThreadNum++; 
    } else{
    //主线程加载图片
    OptimizeImage optimizeImage=OptimizeImage.initializeInstance();
    optimizeImage.loadBitmap(image_uri_path, image_uri_path_view);
    }
   
} catch (Exception e) {
Toast.makeText(context, R.string.loadImageError, Toast.LENGTH_SHORT).show();

}else{
//image_uri_path_view.setVisibility(View.GONE);
image_uri_path_view.setMinimumHeight(30);
}
  }

return convertView;
}


   /**
    * @Description TODO(删除收支记录单击监听事件)
    * @author 彭甜
    *
    */
   public class DeleteBalancePayRecordOnClickListener implements OnClickListener{
    private int position;
       public DeleteBalancePayRecordOnClickListener(int position){
      this.position=position;
       }
@Override
public void onClick(View arg0) {
if(R.id.deleteIncomeRecord==arg0.getId()){
//删除收支记录
final Map mapData= dataDetails.get(position);
if(mapData!=null&&!"".equals(mapData.get("id"))){
AlertDialog.Builder builder = new Builder(context);
builder.setMessage("确认删除吗?");
builder.setTitle("提示");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface arg0, int arg1) {
//删除的收支金额
double amount=PMSUtil.toTwoPointDouble(PMSUtil.isNull(mapData.get("amount")));   
try {
if(incomeRecordService==null){
incomeRecordService=new IncomeRecordServiceImpl(context);
}

Map msg=incomeRecordService.deleteIncomeRecordInfo(mapData);
if((Constant.MSG_RESULT_TRUE).equals(msg.get(Constant.MSG_RESULT_CODE))){

//刷新收支明细ListView
dataDetails.remove(position);
BalancePayDetailAdapter.this.notifyDataSetChanged();
//刷新收支明细ListView 父级
String income_model=PMSUtil.isNull(mapData.get("income_model"));
if((Constant.incomeModel[0]).equals(income_model)){
    //支出数据调整
    int pay_number=Integer.parseInt(PMSUtil.isNull(list.get(positionParent).get("pay_number")));
    double pay_amount_total=PMSUtil.toTwoPointDouble(PMSUtil.isNull(list.get(positionParent).get("pay_amount_total")));
    list.get(positionParent).put("pay_amount_total", PMSUtil.toNPointDouble(pay_amount_total-amount));
    list.get(positionParent).put("pay_number", pay_number-1);
}else if((Constant.incomeModel[1]).equals(income_model)){
    //收入数据调整
    int income_number=Integer.parseInt(PMSUtil.isNull(list.get(positionParent).get("income_number")));
    double income_amount_total=PMSUtil.toTwoPointDouble(PMSUtil.isNull(list.get(positionParent).get("income_amount_total")));
    list.get(positionParent).put("income_amount_total", PMSUtil.toNPointDouble(income_amount_total-amount));
    list.get(positionParent).put("income_number", income_number-1);
}
int income_number=Integer.parseInt(PMSUtil.isNull(list.get(positionParent).get("income_number")));
int pay_number=Integer.parseInt(PMSUtil.isNull(list.get(positionParent).get("pay_number")));
if((income_number<1&&pay_number<1)||(income_number<=0&&pay_number<=1)){
String balance_pay_date=PMSUtil.isNull(list.get(positionParent).get("balance_pay_date"));
incomeRecordService.deleteIncomeRecordByIncomeDate(balance_pay_date);
//但某天收支记录都没有时候 就删除这天的记录
list.remove(positionParent);
//总记录数也就减一
--num;
}
//刷新最上级ListView列表
simpleAdapter.notifyDataSetChanged();
}
Toast.makeText(context, PMSUtil.isNull(msg.get(Constant.MSG_RESULT_DES)), Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.getStackTrace();
Toast.makeText(context,"删除收支记录失败("+e.getMessage()+")", Toast.LENGTH_SHORT).show();
}
arg0.dismiss();
} });
builder.setNegativeButton("取消", new DialogInterface.OnClickListener(){


@Override
public void onClick(DialogInterface arg0, int arg1) {
arg0.dismiss();
}
 
 });
 builder.create().show();

}
}

}

   
   }
   
   /**
    * @Description TODO(图片点击监听)
    * @author 彭甜
    *
    */
   public class ImageViewOnClickListener implements OnClickListener{
            private int position;
       
       public ImageViewOnClickListener(int position){
      this.position=position;
       }
@Override
public void onClick(View view) {
if(R.id.image_uri_path_title==view.getId()){
  //点击图片 
Map<String,Object> map=(Map<String, Object>)  dataDetails.get(position);
String image_uri_path = !PMSUtil.isEmpty(PMSUtil.isNull(map
.get("image_uri_path"))) ? PMSUtil.isNull(map
.get("image_uri_path")) : PMSUtil.isNull(map
.get("thumbnail_path"));
if(image_uri_path!=null&&!"".equals(image_uri_path)){
  Intent intent=new Intent(context,ImageZoomActivity.class);  
  intent.putExtra("image_uri_path", image_uri_path);
  startActivity(intent);
  }
  }

}
   
   }





    }


 有需要的朋友可以留下邮箱我把完整的源码发过去。

  效果图展示链接:http://sj.qq.com/myapp/detail.htm?apkName=opt.ls.liveSteward



评论 96
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值