Android小項目之--ListView與ListAcitivity完善論壇管理效果2(附源碼)

  ListAcitivity 类型布局用来配置应用程序,主要为显示菜单列表、列表明细项目,假如让程序继承 ListActivity ,可以实现以下的方法:

  1. getListAdapter()  取得目前列表项目的 Adapter
  2. getListView()  取得目前列表的 View
  3. getSelectedItemId()  取得目前 Keypad 所选择的 Item ID
  4. getSlectedItemPosition()  取得目前 KeyPad 所选择的Item 索引值
  5. onContentChanged()  ListAcitivity 列表内容更动事件
  6. onListItemClick(ListView ,View ,int,long)  User在列表项目单击触发事件
  7. onRestoreInstanceState(Bundle)  当还原至此实例状态事件
  8. setListAdapter(ListAdapter)  设置 ListAcitivity 的列表项目
  9. setSelection(int)    设置所选择的项目  

  ListAcitivity 默认并不一定要像继承自 Acitivity一样,必须使用 seContentView 来设置版型 Layout 才能显示页面,ListAcitivity 可以在不必重写 Protected void onCreate(Bundle savedInstanceState)的情况下,直接将列表加载至 ListAcitivity 中,非常便利,常用在如投票选项选择、多个项目列表条列显示、文件资源管理等。

  今天此程序将扩展上篇文章遗留下的问题,完善整个实例的全部功能,需要完成的功能清单如下:

  1. 实例继承自 ListAcitivity 实现功能;
  2. 在另外一个类里面实现 BaseAdapter 重写它四个方法;
  3. 得到 ListView 控件里面包含所有控件各自的事件,并为其设置事件监听器;
  4. 长按时如何得到所触发的项,并进行相应的操作,实现长按事件的点击事件。

清单如上,下面是实例运行效果图:



这篇文章将不介绍如何加载数据给 ListView 具体操作你可以参考我这篇文章:http://www.cnblogs.com/TerryBlog/archive/2010/06/05/1752325.html,下面正式进入代码片段,由于代码量相对比较大,这里就不全部发出代码,感兴趣的朋友可以到下面附件下载。
问题处理:
  1. 继承 ListAcitivity 之后,我们main.xml将不可以再放任何控件,如果想再添加控件进行操作,可以自己写扩展 XML。因为继承了ListAcitivity 就可以直接在初始化时为调用
    void android.app.ListActivity.setListAdapter(ListAdapter adapter)

    public void setListAdapter (ListAdapter adapter) 
    Since: API Level 
    1 
    Provide the cursor 
    for the list view. 

    此方法,参数为ListAdapter,上篇我们是利用自己加载的 SimpleAdapter 的适配器做数据源,本篇因为继承了 ListAcitivity 所以数据源我们可以这样写,重写 BaseAdapter ,具体看问题2;

  2. 重写 BaseAdapter 代码如下:

    ExpandedBlockStart.gif代码
    @Override
        
    public int getCount() {
            
    // TODO Auto-generated method stub
            return listitem.size();
        }

        @Override
        
    public Object getItem(int arg0) {
            
    // TODO Auto-generated method stub
            return listitem.get(arg0);
        }

        @Override
        
    public long getItemId(int arg0) {
            
    // TODO Auto-generated method stub
            return arg0;
        }

        @Override
        
    public View getView(int arg0, View arg1, ViewGroup arg2) {
            
    // TODO Auto-generated method stub
            final ViewHolder myViewHolder;
            
    if(arg1==null)
            {
                
                arg1
    =myInflater.inflate(R.layout.listview_row, null);
                myViewHolder
    =new ViewHolder();
            
                ViewHolder.my_TextView
    =(TextView)arg1.findViewById(R.id.topTextView);
                ViewHolder.my_Button
    =(Button)arg1.findViewById(R.id.Button01);
                
                arg1.setTag(myViewHolder);
                
            }
            
    else
            {
                myViewHolder
    =(ViewHolder)arg1.getTag();
            }
            ViewHolder.my_TextView.setText(listitem.get(arg0).get(
    "itemText").toString());
            ViewHolder.my_Button.setText(listitem.get(arg0).get(
    "buttonText").toString());
            ViewHolder.my_Button.setOnClickListener(
    new OnClickListener() {
                
                @Override
                
    public void onClick(View v) {
                    RelativeLayout rl 
    = (RelativeLayout)v.getParent();
                    
    final TextView subView = (TextView)rl.getChildAt(1);
                    
    // TODO Auto-generated method stub
                    new AlertDialog.Builder(myContext)
                    .setTitle(R.string.confirm)
                    .setMessage(R.string.top)
                    .setPositiveButton(R.string.ok, 
    new DialogInterface.OnClickListener() {
                        
                        @Override
                        
    public void onClick(DialogInterface dialog, int which) {
                            
    // TODO Auto-generated method stub
                            subView.setTextColor(Color.RED);
                        }
                    })
                    .setNeutralButton(R.string.cancel, 
    null)
                    .show();
                }
            });
            
            ViewHolder.my_TextView.setOnCreateContextMenuListener(
    new OnCreateContextMenuListener() {
                
                @Override
                
    public void onCreateContextMenu(ContextMenu menu, View v,
                        ContextMenuInfo menuInfo) {
                    
    // TODO Auto-generated method stub
                    ListViewActivity lv=(ListViewActivity)myContext;
                    lv.myRelative
    =(RelativeLayout)v.getParent();
                    menu.setHeaderIcon(R.drawable.icon);
                    menu.setHeaderTitle(ViewHolder.my_TextView.getText());
                    menu.add(
    100"高亮");
                    menu.add(
    010"置頂"); 
                }
        
            
            });
            
             
            
    return arg1;
        }

     

    构造函数为引入上篇上下文和数据;

    方法一:获取数据源的总列数;
    方法二:通过参数值获取每个集合的项;
    方法三:获得当前项的索引;
    方法四:返回我们需要的View。
  3. LayoutInflater 的使用,LayoutInflater 这个类非常有用,它的作用类似于 findViewById() ,不同点的是 LayoutInflater 是用来找layout xml 布局文件,并且实例化!而 findViewById() 是找具体 xml 下的具体 widget 控件(如: Button , TextView 等)。

    一般来讲,我们用 LayoutInflater 做一件事:inflateinflate这个方法总共有四种形式,目的都是把xml 表述的layout 转化为ViewThis class is used to instantiate layout XML file into its corresponding View objects . It is never be used directly -- use getLayoutInflater() or getSystemService(String)getLayoutInflater() or getSystemService(String) to retrieve a standard LayoutInflater instance that is already hooked up to the current context and correctly configured for the device you are running on
      A. Context.public abstract Object getSystemService (String name) Return the handle to a system-level service by name. The class of the returned object varies by the requested name. 具体参见文档。
      B.种获得LayoutInflater 的方法

        (1)通过SystemService获得LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        (2)从给定的context中获取
      C. LayoutInflater.inflate()
        Layout文件转换为View,顾名思义,专门供Layout使用的Inflater。虽然Layout也是View的子类,但在android中    如果想将xml中的Layout转换为View放入.java代码中操作,只能通过Inflater,而不能通过findViewById()。
      
    D.findViewById() 有两种形式
          R.layout.xx 是引用res/layout/xx.xml的布局文件(inflate方法),R.id.xx是引用布局文件里面的组件,组件的idxx...(findViewById方法)。看看R.java配置文件吧,R对文件分类管理,多写几个layout.xml后你会发现,所有的组件id都能用R.id.xx来查看,但是组件不在setContentView()里面的layout中就无法使用,Activity.findViewById()会出现空指针异常
    详细使用步骤如下:

private LayoutInflater myInflater=null;

 

 之后我们在

public View getView(int arg0, View arg1, ViewGroup arg2) {

 

方法里面调用方法参数View arg1使用

arg1=myInflater.inflate(R.layout.listview_row, null);

 

 

即可得到相应的 View ,得到 View 之后即可以轻松的使用 findViewById() 方法操作控件,并为且设置对应的监听事件。

4.上篇文章我们留下了一个问题,即如何在长按时能够得到长按的某一项,并得到项操作相应的业务逻辑,本篇将完成此功能。在继承 ListAcitivity 类里声明 public RelativeLayout myRelative; 此相对布局控件来源于布局XML的布局控件,之后在设置长按事件的处理函数中进行如下操作:

ListViewActivity lv=(ListViewActivity)myContext;
                lv.myRelative
=(RelativeLayout)v.getParent();

 

上述代码为,将上下文引入,得到上下文声明的相对布局控件,因为方法的参数View 为相应的点击控件,为了得到布局控件,使用View.getParent() 得到相对的父控件,这里我用的是 TextView 它放在 RelativeLayout 此控件的下方法,故为getParent(),得到每次点击项的布局控件后,再重写onContextItemSelected ,代码如下:

ExpandedBlockStart.gif代码
public boolean onContextItemSelected(MenuItem item) {
        
// TODO Auto-generated method stub
        switch (item.getItemId()) {
        
case 0:
            ViewHolder.my_TextView
=(TextView)myRelative.getChildAt(1);
            ViewHolder.my_TextView.setBackgroundColor(Color.BLUE);
            
return true;
        
case 1:
            ViewHolder.my_TextView
=(TextView)myRelative.getChildAt(1);
            Toast.makeText(
this, ViewHolder.my_TextView.getText()+"添加置頂效果"1000).show();
            
return true;
         
        }
        
return super.onContextItemSelected(item);
    }

 

 

这里有必要解释一下,这一段实现菜单的选择功能,应该放在 Activity 代码类里面,因为上面我们通过在此类中声明一个 RelativeLayout 然后当点击时我们即为它赋值,点击完某一菜单按钮后即返回 Activity 页面,得到布局,我们在这里要实现的只有通过操作相对布局控件里面包含的控件然后进行操作即可完全实现 这一功能,在布局控件里面找控件可用此方法 getChildAt(int index);注意上面条件分支语句不是跳出而是返回一个真。

到此,此功能己经得到实现,在此要感谢以下两人对我的帮助:QQ:182041935---QQ120460734

 

源码下载:/Files/TerryBlog/listViewDemo.rar

 

如果你有什么疑问或者建议 你可以  QQ285735942 Email:terryyhl@gmail.com

 

转载于:https://www.cnblogs.com/TerryBlog/archive/2010/06/07/1753572.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker 覆盖 entrypoint_最佳实践,Dockerfile中ENTRYPOINT与CMD指令的区别与建议

通过本文你会获得什么熟悉Dockerfile中ENTRYPOINT和CMD指令之间的区别,以及在实际项目中的使用建议。1 - 开始前准备首先你要有个docker环境,以下实验基于:docker 18.09,以及alpine:3.8镜像。下载基础镜像docker pull alpine:3.82…

单实例单向rac搭建gg流

1、 m1 m2 m3 source端 2、 在m1 m2 m3 上 /etc/hosts 172.16.10.140 source source上 添加 #public network 172.16.15.101 m1 172.16.15.102 m2 172.16.15.103 m3 #private network 10.11.11.1 m1-pri 10.11.11.2 m2-pri 10.11.11.3 m3-pri 29 #VIP network 172.16.15.1…

python自动登录教程_Python 实现自动登录+点击+滑动验证功能

需要用到的库有selenium,还需要安装Chrome浏览器驱动,具体如何安装我就不详述了 在这里我模拟了csdn的登录过程 ** 1**.首先打开网页,用户名密码登录,然后定位用户名输入框,和密码输入框,输入后 点击登陆 弹…

2月份.xyz域名总量10强:西数称王 注册量破百万

IDC评述网(idcps.com)02月25日报道:根据ntldstats.com发布的最新数据显示,截止至2016年2月24日17时,国内外.xyz域名总量十强名单顺序,与上期1月28日对比,无任何变化。最值得一提的是&#xff0c…

flash作业_一起作业,你很智障!

电子作业现在貌似很流行,在很多学校都有,具体的利弊就不再赘述,可以点击前面的超链接跳转到某度百科自己看。今天只是忍不住怕盘点下国内知名电子作业平台——一起作业网的一些智障设计。。。本来想写到这里去的:有哪些让人拍案叫…

QtCreator添加图片资源

在qt creator里面,设计师designer是一个很好用的功能,通过它我们可以可视化的设计界面。当然了,设计界面就需要各种各样的效果,图片资源是不可少的。今天,小编就来教大家qt怎么添加图片资源 工具/原料 qt creator方法/…

只安装python_AI帮你写Python,安装只需5步,还能任你调教 | 开源

一行一行地敲代码就像是徒手搬砖,聪明的程序猿们表示:我们要解放生产力! 比如像这样:在机器学习的时代,AI智能补全代码早已不是梦想,各种IDE和插件都在努力帮助程序猿减少击键次数,延长键盘寿命…

巧用apply让javascript函数仅执行一次

RT,有时候我们只想要让某些脚步函数执行一次就算完成任务了。如何实现这种功能呢?简单模仿下面这段就可以轻松搞定了: 代码 varobj newObject();obj.triggerOnce function(fn) { //控制让函数只触发一次returnfunction() { try{ fn.ap…

评论时间戳格式化

如图: 注意,评论时间戳的格式,刚才,几小时之前,几天之前..... 实现需要一个时间格式的工具类,如果用java.util.Date当然也可以实现,这里说的是更方便的joda-time。 maven地址:http:/…

android lint工作机制,Android架构

MVCmvc model view controller 模式视图控制器M: 业务逻辑处理V:处理数据显示的部分C:Activity处理用户交互的问题,中间桥梁的作用,解耦的作用。特点:耦合性低扩展性好,利于维护模块职责划分明确Model层&am…

opendds开发指南中文版_最强的开发者技术路线图已经更新到 2020 GitHub 超 118k还有中文...

想必大家都知道,学习路线图是学习一门新技术的入门指南,让我们对技术有一个大概的了解,并且在学习感到困惑时被指导。所谓不求最好,但求最全。今天在在就给大家带来了一个国外大牛开源的项目 — 「developer-roadmap」&#xff0c…

iOS APP网络分析之rvictl(可以捕捉除了Wifi以外的网络类型)

iOS应用(包括移动应用)的网络分析,一般采用将移动设备上的流量导入到PC机上,利用PC上成熟的数据包分析工具例如wireshark等来进行分析的方法。 总的来说,有以下三种方法:一、在PC上设置网络共享&#xff0c…

oracle批量update数据_东方国信大数据面试真题

东方国信学长1Hadoop工程师笔试题(金融事业部)1)技术基础题(共十题,每题5分)(1)列举在Linux系统下可以在看系统各项性能的工具(区分CPU、内存、硬盘、网络等)…

eclipse定制化配置调优、初始化配置指南、可以解决启动慢等问题

配置eclipse的jvm参数 打开eclipse根目录下的eclipse.ini在最后面加上如下的jvm参数 -Xms400m -Xmx1400m -XX:NewSize128m -XX:MaxNewSize512m -XX:PermSize96m -XX:MaxPermSize128m -server -XX:CompileThreshold100 -XX:UseParNewGC -XX:UseConcMarkSweepGC -XX:CMSInitiatin…

SEC SOC Test Board 在WIN 7下的安装

首先找到“设备和打印机”点击打开 如果你插上了USB线,会看到,安装不成功时会有个“!” 双击它,出现 点击“属性”,出现 点击“改变设置”,出现 点击“更新驱动程序”,出现 点击进去&#xff0c…

吴枫 python小课怎么样_编程中,有哪些好的习惯从一开始就值得坚持?

电影《喜剧之王》里,周星驰饰演的尹天仇,是一个渴望成为真正的演员,却不断沦为落魄跑龙套的小人物。即便如此,他对演戏的态度始终认真而可敬。他每天不但锲而不舍寻找演戏机会,还在街坊福利社开了个戏剧训练班&#xf…

设置width不生效_关于padding被计算在width中问题——box-sizing相关

前一阵子遇到一个小问题,在同样的样式(主要是宽高边距之类的)条件下,DIV在移动端和PC端的宽度不一样,排除了绝大多数样式的问题,但是有个比较陌生,就是box-sizing,其实经常看到&…

我的Python成长之路---第六天---Python基础(19)---2016年2月20日(晴)

shelve模块shelve模块是pickle模块的扩展,可以通过key,value的方式访问pickle持久化保存的数据持久化保存:12345678910111213import shelvesw shelve.open(shelve_test.pkl) # 创建shelve对象name [13, 14, 145, 6] # 创建一个列表dist_tes…

apache 设置404 页面_SpringBoot自定义错误页面

SpringBoot请求错误如404可能看到如下页面:有时可能需要自定义错误页面针对不同的http.status,如404/400。【1】解决方法① 注册错误页面如下所示:Componentpublic class ErrorPageConfig implements ErrorPageRegistrar { Override public void r…

Java 编程:如何提高性能?(简单总结篇)

2019独角兽企业重金招聘Python工程师标准>>> 开发者在编程中除了要有编程规范,还要注意性能,在 Java 编程中有什么提高性能的好办法呢? 本文转自国内 ITOM 行业领军企业 OneAPM Cloud Insight(一款能够优雅监控多种操作…