热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

Android实现带有边框的ListView和item的方法

这篇文章主要介绍了Android实现带有边框的ListView和item的方法,结合实例形式分析了ListView和item四周添加边框的实现步骤与相关技巧,需要的朋友可以参考下

本文实例讲述了Android实现带有边框的ListView和item的方法。分享给大家供大家参考,具体如下:

想为ListView和item四周添加边框有两种方法:

1.贴一张带有边框效果的背景图

2.自定义Draw的方法

第一种方法较第二种方法更耗系统资源,但是用法简单,只需要一张图设置为相应控件的背景即可,而第二种灵活性好些。

这次是实现带有边框的ListView和item,为此写个简单Demo 学习学习

先看下Demo运行效果吧

下面是主要代码,主要是用到Canvas.drawLine(...)代码简单,我就不啰嗦了

BorderListView.Java

package com.borderlistview.manymore13;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ListView;
public class BorderListView extends ListView{
  public BorderListView(Context context) {
    super(context);
  }
  public BorderListView(Context context, AttributeSet attrs)
  {
    super(context, attrs);
  }
  @Override
  protected void onDraw(Canvas canvas) {
    float width = getWidth();
    float height= getHeight();
    int lineWidth = 10; // 线宽十个像素
    int grayColor = Color.GRAY;
    Paint mLinePaint = new Paint();
    mLinePaint.setColor(grayColor);
    mLinePaint.setStyle(Paint.Style.STROKE);
    mLinePaint.setAntiAlias(true);
    mLinePaint.setStrokeWidth(lineWidth);
    // 画四周的边框 注意下面的 lineWidth/2 不加的话四周的线可能不一样粗
    canvas.drawLine(0f, 0+lineWidth/2, width, 0+lineWidth/2, mLinePaint);
    canvas.drawLine(width-lineWidth/2, 0, width-lineWidth/2, height, mLinePaint);
    canvas.drawLine(width-lineWidth/2, height-lineWidth/2, 0, height-lineWidth/2, mLinePaint);
    canvas.drawLine(0+lineWidth/2, height, 0+lineWidth/2, 0,mLinePaint);
    super.onDraw(canvas);
  }
}

ListViewItem.java   ListView的item 添加虚线和红线

package com.borderlistview.manymore13;
import com.manymore13.MyListview.R;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Paint;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
 public class ListViewItem extends RelativeLayout{
  private View viewHolder;
  private TextView tvEventName;
  private Context c;
  private FrameLayout leftFrame;
  public ListViewItem(Context context) {
    super(context);
    LayoutInflater flater = LayoutInflater.from(context);
    viewHolder = flater.inflate(R.layout.item, this);
    getViewAndSetClick();
    c = context;
  }
  private void getViewAndSetClick()
  {
    tvEventName = (TextView)viewHolder.findViewById(R.id.eventName);
    leftFrame = (FrameLayout)viewHolder.findViewById(R.id.frame);
  }
  public void setEventName(String name)
  {
    tvEventName.setText(name);
  }
  public void updateView()
  {
    this.postInvalidate();
  }
  @Override
  protected void dispatchDraw(Canvas canvas) {
    super.dispatchDraw(canvas);
    Resources res = getResources();
    int grayColor = Color.GRAY;
    int redColor = res.getColor(R.color.red);
    int leftFramepos = leftFrame.getRight();
    Paint mLinePaint = new Paint();
    mLinePaint.setColor(redColor);
    mLinePaint.setStyle(Paint.Style.STROKE);
    mLinePaint.setStrokeWidth(2);
    //画两条直线
    canvas.drawLine(leftFramepos+20, 0f, leftFramepos+20, getHeight(), mLinePaint);
    canvas.drawLine(leftFramepos+25, 0f, leftFramepos+25, getHeight(), mLinePaint);
    // 画虚线
    mLinePaint.setColor(grayColor);
    DashPathEffect effect = new DashPathEffect(new float[] { 5,5, 5, 5, 5}, 3);
    mLinePaint.setAntiAlias(true);
    mLinePaint.setPathEffect(effect);
    canvas.drawLine(0, getHeight(), getWidth(), getHeight(), mLinePaint);
  }
}

MyBaseAdaper.java

package com.borderlistview.manymore13;
import java.util.List;
import android.content.Context;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.BaseAdapter;
import android.widget.ImageView;
public class MyBaseAdaper extends BaseAdapter{
  private List list;
  private Context c;
  MyBaseAdaper(Context c, List list)
  {
    this.list = list;
    this.c = c;
  }
  @Override
  public int getCount() {
    // TODO Auto-generated method stub
    return list.size();
  }
  @Override
  public Object getItem(int i) {
    // TODO Auto-generated method stub
    return list.get(i);
  }
  @Override
  public long getItemId(int i) {
    // TODO Auto-generated method stub
    return i;
  }
  @Override
  public View getView(int i, View view, ViewGroup viewgroup) {
    ListViewItem itemView = null ;
    if(view == null){
      itemView = new ListViewItem(c);
    }else{
      itemView = (ListViewItem)view;
    }
    itemView.setEventName(list.get(i));
    return itemView;
  }
}

另外,在写本次Demo的时候报了错误,有错就改 Caused by: java.lang.NoSuchMethodException:BorderListView(Context,AttributeSet)

在 BorderListView类中加一个构造函数 搞定

public BorderListView(Context context, AttributeSet attrs)
{
super(context, attrs);
}

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android编程之activity操作技巧总结》、《Android资源操作技巧汇总》、《Android文件操作技巧汇总》、《Android操作SQLite数据库技巧总结》、《Android操作json格式数据技巧总结》、《Android数据库操作技巧总结》、《Android编程开发之SD卡操作方法汇总》、《Android开发入门与进阶教程》、《Android视图View技巧总结》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。


推荐阅读
  • 本文总结了在使用Ionic 5进行Android平台APK打包时遇到的问题,特别是针对QRScanner插件的改造。通过详细分析和提供具体的解决方法,帮助开发者顺利打包并优化应用性能。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • IneedtofocusTextCellsonebyoneviaabuttonclick.ItriedlistView.ScrollTo.我需要通过点击按钮逐个关注Tex ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文详细介绍了如何在 Linux 平台上安装和配置 PostgreSQL 数据库。通过访问官方资源并遵循特定的操作步骤,用户可以在不同发行版(如 Ubuntu 和 Red Hat)上顺利完成 PostgreSQL 的安装。 ... [详细]
  • 本文探讨了在 PHP 中处理 JSON 编码时中文字符显示为 Unicode 转义序列的问题,并提供了多种有效的解决方法,包括使用正则表达式替换、URL 编码以及利用 PHP 5.4 及以上版本提供的 JSON_UNESCAPED_UNICODE 选项。 ... [详细]
  • 如何在PostgreSQL中查看数据表
    本文将指导您使用pgAdmin工具连接到PostgreSQL数据库,并展示如何浏览和查找其中的数据表。通过简单的步骤,您可以轻松访问所需的表结构和数据。 ... [详细]
  • 利用存储过程构建年度日历表的详细指南
    本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ... [详细]
  • 在使用SQL Server进行动态SQL查询时,如果遇到LIKE语句无法正确返回预期结果的情况,通常是因为参数传递方式不当。本文将详细探讨这一问题,并提供解决方案及相关的技术背景。 ... [详细]
  • 本文介绍如何通过创建替代插入触发器,使对视图的插入操作能够正确更新相关的基本表。涉及的表包括:飞机(Aircraft)、员工(Employee)和认证(Certification)。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
author-avatar
无视一个水阿哥_470
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有