android自定义控件自动换行效果实现

来源:互联网 发布:中田健身工作室 知乎 编辑:程序博客网 时间:2024/05/16 18:35

转自别人的文章,自己花时间做了优化写了demo,不想一点点写demo的可以在后面自己下我的demo


修改并简化后的demo下载地址 http://download.csdn.net/detail/wjyyxzzjnws/8563581


第一篇博客里面有介绍一篇关于自动换行实现诸多自定义控件跟各种效果的博文,但是碍于当初技术能力有限,写的jar包里的代码乱七八糟,在最近忙完了手头的工作,不经意间翻看了之前的代码,真是惨不忍睹,随决定重新封装。重新编写的android-custom-vg前后修改了多次版本暂定为2.6.0,模拟的ListView加载数据的流程,为了更方便的使用。只做了最基础的效果,ListView中定位某个View显示的属性,则没有被实现。

      自定义控件换行效果jar调用API:

       setDividerWidth(int   dividerWidth);  //设置两个Item的水平间距,第一个Item距离左边框距离为0

       setDividerHeight(int   dividerHeight); //设置两个Item的垂直间距,第一行Item距离顶部边框距离为0

       setOnItemClickListener(OnItemClickListener   listener);  //获取Item的点击事件

       setOnItemLongClickListener(OnItemLongClickListener   listener); //获取Item的长按事件

       

       效果图:


                       

 1、activity_main.xml:为了实现滑动效果,把自定义控件放进ScrollView控件中

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <ScrollView  
  7.         android:layout_width="match_parent"  
  8.         android:layout_height="match_parent"  
  9.         android:background="#FFF"  
  10.         android:fadingEdge="none"  
  11.         android:fillViewport="true"  
  12.         android:scrollbars="none" >  
  13.   
  14.         <LinearLayout  
  15.             android:layout_width="match_parent"  
  16.             android:layout_height="wrap_content"  
  17.             android:gravity="top|left"  
  18.             android:orientation="vertical" >  
  19.   
  20.             <com.custom.vg.list.CustomListView  
  21.                 android:id="@+id/sexangleView"  
  22.                 android:layout_width="fill_parent"  
  23.                 android:layout_height="wrap_content"  
  24.                 android:layout_margin="10dp" />  
  25.         </LinearLayout>  
  26.     </ScrollView>  
  27.   
  28.     <LinearLayout  
  29.         android:layout_width="wrap_content"  
  30.         android:layout_height="wrap_content"  
  31.         android:layout_alignParentRight="true"  
  32.         android:orientation="vertical" >  
  33.   
  34.         <Button  
  35.             android:id="@+id/btn_add"  
  36.             android:layout_width="wrap_content"  
  37.             android:layout_height="wrap_content"  
  38.             android:text="+" />  
  39.   
  40.         <Button  
  41.             android:id="@+id/btn_remove"  
  42.             android:layout_width="wrap_content"  
  43.             android:layout_height="wrap_content"  
  44.             android:text="-" />  
  45.     </LinearLayout>  
  46.   
  47. </RelativeLayout>  

 2、MainActivity.java

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. import com.custom.vg.list.CustomListView;  
  2. import com.custom.vg.list.OnItemClickListener;  
  3. import com.custom.vg.list.OnItemLongClickListener;  
  4.   
  5. public class MainActivity extends Activity implements OnClickListener {  
  6.       
  7.     private String TAG = MainActivity.class.getSimpleName();  
  8.     private CustomListView lv;  
  9.     private List<String> list = null;  
  10.     private MainSexangleAdapter adapter;  
  11.   
  12.     @Override  
  13.     protected void onCreate(Bundle savedInstanceState) {  
  14.         super.onCreate(savedInstanceState);  
  15.         setContentView(R.layout.activity_main);  
  16.           
  17.         lv = (CustomListView) findViewById(R.id.sexangleView);  
  18.         findViewById(R.id.btn_add).setOnClickListener(this);  
  19.         findViewById(R.id.btn_remove).setOnClickListener(this);   
  20.           
  21.         new Thread(new MyFormatListThread()).start();         
  22.     }  
  23.       
  24.     private void ShowSexangleListView(){  
  25.           
  26.         adapter = new MainSexangleAdapter(this, list);  
  27.         lv.setDividerHeight(10);  
  28.         lv.setDividerWidth(10);  
  29.         lv.setAdapter(adapter);  
  30.         lv.setOnItemClickListener(new OnItemClickListener() {  
  31.               
  32.             @Override  
  33.             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {  
  34.                 Toast.makeText(MainActivity.this"点击了 : "+arg2, 300).show();  
  35.             }  
  36.         });  
  37.           
  38.         lv.setOnItemLongClickListener(new OnItemLongClickListener() {  
  39.               
  40.             @Override  
  41.             public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {  
  42.                 Toast.makeText(MainActivity.this"Long点击了 : "+arg2, 300).show();  
  43.                 return true;  
  44.             }  
  45.         });  
  46.     }  
  47.       
  48.     private Handler handler = new Handler(Looper.getMainLooper()){  
  49.   
  50.         @Override  
  51.         public void handleMessage(Message msg) {  
  52.             try{  
  53.                 if(msg.getData().containsKey("showSexangleListView")){  
  54.                     ShowSexangleListView();  
  55.                 }  
  56.             }catch(Exception e){}  
  57.         }  
  58.           
  59.     };  
  60.       
  61.     public class MyFormatListThread implements Runnable{  
  62.   
  63.         @Override  
  64.         public void run() {  
  65.             Bundle b = new Bundle();  
  66.             try{  
  67.                 list = new ArrayList<String>();  
  68.                 list.add("宇宙");  
  69.                 list.add("宙即我心");  
  70.                 list.add("心我心即宇");  
  71.                 list.add("宇宙即我心我心即");  
  72.                 list.add("心即宇宙细");  
  73.                 list.add("即");  
  74.                 list.add("宇宙细微");  
  75.                 list.add("祥渊源");  
  76.                 list.add("之发祥渊源实为");  
  77.                 list.add("文明之");  
  78.                 list.add("发祥");  
  79.                 list.add("源实为诸人种");  
  80.                 list.add("宇宙");  
  81.                 list.add("宙即我心");  
  82.                 list.add("心我心即宇");  
  83.                 list.add("宇宙即我心我心即");  
  84.                 list.add("心即宇宙细");  
  85.                 list.add("即");  
  86.                 list.add("宇宙细微");  
  87.                 list.add("祥渊源");  
  88.                 list.add("之发祥渊源实为");  
  89.                 list.add("文明之");  
  90.                 list.add("发祥");  
  91.                 list.add("源实为诸人种");  
  92.                   
  93.                 b.putBoolean("showSexangleListView"true);  
  94.             }catch(Exception e){  
  95.                 Log.w(TAG, e);  
  96.             }finally{  
  97.                 sendMsgHandler(handler,b);  
  98.             }  
  99.         }  
  100.     }  
  101.   
  102.     @Override  
  103.     public void onClick(View v) {  
  104.         switch (v.getId()) {  
  105.         case R.id.btn_add:  
  106.       
  107.             list.add("Button添加"+list.size());  
  108.             adapter.notifyDataSetChanged();           
  109.             break;  
  110.   
  111.         case R.id.btn_remove:  
  112.   
  113.             list.remove(0);  
  114.             adapter.notifyDataSetChanged();  
  115.             break;  
  116.         }  
  117.           
  118.     }  
  119.       
  120.     private void sendMsgHandler(Handler handler,Bundle bundle){  
  121.         Message msg = handler.obtainMessage();  
  122.         msg.setData(bundle);  
  123.         handler.sendMessage(msg);  
  124.     }  
  125.       
  126.     private class GetDataTask extends AsyncTask<Void, Void, String[]> {  
  127.   
  128.         @Override  
  129.         protected String[] doInBackground(Void... params) {  
  130.             // Simulates a background job.  
  131.             try {  
  132.                 Thread.sleep(1000);  
  133.                 if(list == null)  
  134.                     list = new ArrayList<String>();  
  135.                 else  
  136.                     list.clear();  
  137.                 list.add("宇宙");  
  138.                 list.add("宙即我心");  
  139.                 list.add("心我心即宇");  
  140.                 list.add("宇宙即我心我心即");  
  141.                 list.add("心即宇宙细");  
  142.                 list.add("即");  
  143.                 list.add("宇宙细微");  
  144.                 list.add("祥渊源");  
  145.                 list.add("之发祥渊源实为");  
  146.                 list.add("文明之");  
  147.                 list.add("发祥");  
  148.                 list.add("源实为诸人种");  
  149.                 list.add("宇宙");  
  150.                 list.add("宙即我心");  
  151.                 list.add("心我心即宇");  
  152.                 list.add("宇宙即我心我心即");  
  153.                 list.add("心即宇宙细");  
  154.                 list.add("即");  
  155.                 list.add("宇宙细微");  
  156.                 list.add("祥渊源");  
  157.                 list.add("之发祥渊源实为");  
  158.                 list.add("文明之");  
  159.                 list.add("发祥");  
  160.                 list.add("源实为诸人种");  
  161.             } catch (InterruptedException e) {  
  162.             }  
  163.             return null;  
  164.         }  
  165.   
  166.         @Override  
  167.         protected void onPostExecute(String[] result) {  
  168.             // Do some stuff here  
  169.   
  170.             // Call onRefreshComplete when the list has been refreshed.  
  171.             ShowSexangleListView();  
  172.   
  173.             super.onPostExecute(result);  
  174.         }  
  175.     }  
  176.   
  177. }  

3、MainSexangleAdapter:继承自CustomAdapter

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. import com.custom.vg.list.CustomAdapter;  
  2.   
  3. public class MainSexangleAdapter extends CustomAdapter {  
  4.       
  5.     private List<String> list;  
  6.     private Context con;  
  7.     private LayoutInflater inflater;  
  8.   
  9.     public MainSexangleAdapter(Context context, List<String> list) {  
  10.         this.con = context;  
  11.         this.list = list;  
  12.         inflater = LayoutInflater.from(con);  
  13.     }  
  14.   
  15.     @Override  
  16.     public int getCount() {  
  17.         return list.size();  
  18.     }  
  19.   
  20.     @Override  
  21.     public Object getItem(int position) {  
  22.         return position;  
  23.     }  
  24.   
  25.     @Override  
  26.     public long getItemId(int position) {  
  27.         return position;  
  28.     }  
  29.   
  30.     @Override  
  31.     public View getView(int position, View convertView, ViewGroup parent) {  
  32.   
  33.         ViewHolder vh = null;  
  34.         if(convertView == null){  
  35.             vh = new ViewHolder();  
  36.               
  37.             convertView = inflater.inflate(R.layout.adapter_sexangle_item_style, null);  
  38.               
  39.             vh.tv = (TextView) convertView.findViewById(R.id.adapter_text);  
  40.               
  41.             convertView.setTag(vh);  
  42.         }else{  
  43.             vh = (ViewHolder) convertView.getTag();  
  44.         }  
  45.           
  46.         String str = list.get(position);  
  47.         vh.tv.setText(str);  
  48.           
  49.         return convertView;  
  50.     }  
  51.       
  52.     public class ViewHolder{  
  53.         public TextView tv;  
  54.     }  
  55.   
  56. }  

基本调用方法跟ListView模式很近,Item可以自定义任意界面,不局限于上图。如需对Item操作显示不同效果也可在Adapter中进行处理,修改完List集合中的数据然后adapter刷新操作即可。

demo 下载:http://download.csdn.net/detail/wjyyxzzjnws/8563549


1 0