zoukankan      html  css  js  c++  java
  • 【android开发记录片】android下实现圆角列表布局控件

    引子

    今天闲来做了一个类似iphone的圆角列表,先看效果。


    图片中绿色线条的是列表头文字,红色的是列表落款文字。此两处都可以显示/隐藏及动态改变值。对于列表头还可以设置文字的位置(靠左,靠右,居中)。点击图片中的地区一行,转到下面省份选择:



    关于列表行

    列表中的一行默认的定义为:

        左边的标题(title)

        右边的内容(value)

        还有靠右的箭头

    其中标题是一定会显示的,而“内容”如果为null,则不会显示,箭头是一个显示与否的boolean。则 CornerCell定义如下:

    public class CornerCell {
    	
    	private String title;
    	private String value;
    	private boolean isArrow;
    	private View view;
    	
    	public CornerCell(String title){
    		this(title, null, false);
    	}
    	
    	public CornerCell(String title, boolean isArrow){
    		this(title, null, isArrow);
    	}
    	
    	public CornerCell(String title, String value, boolean isArrow){
    		this.title = title;
    		this.value = value;
    		this.isArrow = isArrow;
    	}
    	
    	//getter and setter
    	
    	@Override
    	public String toString() {
    		return String.format(
    				"[CornerCell: title=%1$s, value=%2$s, isArrow=%3$s]", 
    				title, 
    				value, 
    				isArrow
    				);
    	}
    }
    

      

    圆角列表容器

    CornerRowLayout 继承于 LinearLayout,并实现了OnClickListener接口。

    其构造方法如下:

     1 public CornerRowLayout(Context context, AttributeSet attrs) {
     2     super(context, attrs);
     3     
     4     this.isShowValue = true;
     5     
     6     contentLy = new LinearLayout(context, attrs);
     7     contentLy.setBackgroundResource(R.drawable.shape_corner_list_background);
     8     contentLy.setOrientation(LinearLayout.VERTICAL);
     9     
    10     LayoutParams lp = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
    11     headerTX = new TextView(getContext());
    12     headerTX.setLayoutParams(lp);
    13     
    14     footerTX = new TextView(getContext());
    15     footerTX.setLayoutParams(lp);
    16     footerTX.setGravity(Gravity.RIGHT);
    17     footerTX.setTextSize(13);
    18     
    19     //设置为垂直布局
    20     this.setOrientation(LinearLayout.VERTICAL);
    21     this.addView(headerTX);
    22     this.addView(contentLy);
    23     this.addView(footerTX);
    24 }


    设置列表内容

     1 /**
     2  * 设置这个表格的数据,会直接重新渲染整个表格
     3  *    @param cells
     4  */
     5 public void setCellList(List<CornerCell> cells){
     6     contentLy.removeAllViews();
     7     
     8     for(int i=0;i<cells.size();i++){
     9         CornerCell cell = cells.get(i);
    10         
    11         //如果 CornerCell 已经有自定义的视图,就用自定义的视图
    12         View cellView = cell.getView() == null ?
    13                 View.inflate(getContext(), R.layout.nerve_corner_cell, null)
    14                 :
    15                 cell.getView();
    16         
    17         if(cellView == null)
    18             continue;
    19         
    20         System.out.println(cell);
    21         
    22         /*
    23          * 对头,中,尾进行分组
    24          */
    25         if(i == 0)
    26             cellView.setBackgroundResource(R.drawable.shape_corner_list_top);
    27         else{
    28             //设置顶部的margin为1,就会出现一条细线
    29             LayoutParams lp = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
    30             lp.setMargins(0, 1, 0, 0);
    31             cellView.setLayoutParams(lp);
    32             
    33             if(i == cells.size() - 1)
    34                 cellView.setBackgroundResource(R.drawable.shape_corner_list_bottom);
    35             else
    36                 cellView.setBackgroundResource(R.drawable.shape_corner_list_middle);
    37         }
    38             
    39         
    40         //设置可以点击,不然按住时不会有效果
    41         //cellView.setClickable(true);
    42         //cellView.setPadding(5, 8, 5, 8);
    43         
    44         ((TextView)cellView.findViewById(R.id.cell_title)).setText(cell.getTitle());
    45         if(isShowValue)
    46             ((TextView)cellView.findViewById(R.id.cell_value)).setText(cell.getValue());
    47         
    48         cellView.findViewById(R.id.cell_arrow)
    49             .setVisibility(cell.isArrow() ? View.VISIBLE : View.GONE);
    50         
    51         cellView.setOnClickListener(this);
    52         cellView.setTag(i);
    53         //将这个view添加到本地容器
    54         contentLy.addView(cellView);
    55     }
    56     
    57     resetAll();
    58 }

    如何使用

    1.先将相关的java类导入项目,还有相关的layout,drawable,style文件


    2.在想加入圆角列表的页面加入以下内容:

    <org.nerve.ui.corner.CornerRowLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
       	    android:id="@+id/myCornerLayout"
       	    android:layout_width="fill_parent"
    		android:layout_height="fill_parent" 
    		android:padding="5dp"
    		android:background="#DCDDDB"
    		>
    </org.nerve.ui.corner.CornerRowLayout>

    这个根据实际情况而定,如果列表内容太多,需要嵌套在一个SrollView内。


    3.在Activity中:

    cornerL = (CornerRowLayout)findViewById(R.id.myCornerLayout);
    
    List<CornerCell> cells = new ArrayList<CornerCell>();
    cells.add(new CornerCell("姓名", "集成显卡", true));
    cells.add(new CornerCell("年龄", "18岁", true));
    cells.add(new CornerCell("地区", "广西壮族自治区", true));
    
    cornerL.setCellList(cells);
    cornerL.setOnRowClickListener(this);
    
    cornerL.setHeader("以下信息我们会绝对保密");
    cornerL.setFooter("2013-5-24");


    效果就出来了。


    4.Activity实现OnRowClickListenrr接口:

    @Override
    public void onRowClick(View v, int index) {
    	if(index == 2){
    		Intent intent = new Intent(ConrnerActivity.this, SelectProvinceActitivy.class);
    		startActivityForResult(intent, PROVINCE);
    	}
    }


    源代码下载:http://download.csdn.net/detail/ssrc0604hx/5442505


    感谢阅读






  • 相关阅读:
    分布式git
    服务器上的git
    git分支
    剑指offer(38)二叉树的深度
    剑指offer(37)数字在排序数组中出现的次数。
    JS刷题总结
    剑指offer(36)两个链表中的第一个公共节点
    剑指offer(35)数组中的逆序对
    剑指offer(34)第一个只出现一次的字符
    剑指offer(33)丑数
  • 原文地址:https://www.cnblogs.com/nerve/p/3185422.html
Copyright © 2011-2022 走看看