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 代码如下:

    代码

    @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(1, 0, 0, "高亮");
                    menu.add(0, 1, 0, "置頂"); 
                }
                
            });
            
             
            return arg1;
        }

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

    方法一:获取数据源的总列数;
    方法二:通过参数值获取每个集合的项;
    方法三:获得当前项的索引;
    方法四:返回我们需要的View。

  3. LayoutInflater 的使用,LayoutInflater 这个类非常有用,它的作用类似于 findViewById() ,不同点的是 LayoutInflater 是用来找layout 下 xml 布局文件,并且实例化!而 findViewById() 是找具体 xml 下的具体 widget 控件(如: Button , TextView 等)。

    一般来讲,我们用 LayoutInflater 做一件事:inflate。inflate这个方法总共有四种形式,目的都是把xml 表述的layout 转化为View。This 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是引用布局文件里面的组件,组件的id是xx...(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 ,代码如下:

代码

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

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

  1. Android小項目之---ListView实现论坛管理效果(附源碼)

    在android系統中,ListView的用法稍微複雜一點,配置Adpater就有幾種方法,如ArrayAdapter,SimpleAdapter等.查了一些網上的相關例子,有很多都是用ListAct ...

  2. Android小項目之---時間線程應用(附源碼)

    进程 在Android 中,进程是应用程序的完整实现,而不是用户通常了解的那样.他们主要用途很简单: • 提高稳定性和安全性,将不信任或者不稳定的代码移动到其他进程. • 可将多个.apk 包运行在同 ...

  3. Android小項目之---吃飯選哪?--》選擇對話框(附源碼)

    還記得早先我們做的記算器的例子嗎?當中的驗證判斷用到了對話框,今天我們來做一個不一樣的對話框,要做的這個小例子是一個可供選擇效果的對話框 即層層迭迭的Alert Dialog:界面方面我們擺放一個Bu ...

  4. Android 小項目之--猜名字有獎!RadionButton 和RadionGroup應用(附源碼)

    有想過友Android的小屏幕上把asp.net 的RadionButtonList搬進來用嗎?答案是肯定的,Android 的Tool工具提供了一個RadioGroup控件,可將各大自不同的Radi ...

  5. Android 小項目之---Iphone拖动图片特效 (附源码)

    曾经被Iphone用手指在屏幕上滑来滑去拖动图片的操作方式吸引吗?在Android里头,这并不是什么难事. 所需要的技术点如下:Android.content.Context .Android.wid ...

  6. [原创]jQuery推箱子小游戏(100关且可扩展可选关),休闲,对战,娱乐,小游戏,下载即用,兼容iPad移动端,代码注释全(附源码)

    Sokoban 介绍 [原创]jQuery推箱子小游戏(100关且可扩展可选关),休闲,对战,娱乐,小游戏,下载即用,兼容iPad移动端,代码注释全(附源码) 游戏说明 经典的推箱子是一个来自日本的古 ...

  7. 微信小程序/uni-app 蓝牙打印开发教程和常见问题总结【文末附源码】

    微信小程序/uni-app 蓝牙打印开发教程和常见问题总结[文末附源码] 文章目录 微信小程序/uni-app 蓝牙打印开发教程和常见问题总结[文末附源码] 1️⃣ 写在前面 2️⃣ 蓝牙连接流程 3 ...

  8. android静态动画,LayoutAnimation给ListView中的item设置动态出场效果(实例)

    LayoutAnimation作用于ViewGroup,为ViewGroup指定一个动画,当它的子元素出场时都按照这个动画出场. LayoutAnimation作用于viewgroup有两种方式: 1 ...

  9. php 邮币卡源码,如何使用CSS的Grid布局实现小松鼠邮票的效果(附源码)

    本篇文章给大家带来的内容是关于如何使用CSS的Grid布局实现小松鼠邮票的效果(附源码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 效果预览 源代码下载 每日前端实战系列的全部源 ...

最新文章

  1. Android EditText不弹出输入法焦点问题的总结
  2. golang 打印函数名/文件名/行号 Callers
  3. flutter可视化_Flutter 对Dart情有独钟的那些事儿
  4. mysql命令导入存储过程报错_mysql导入存储过程时declare报错的有关问题解决
  5. delphi virtual dynamic
  6. 经典排序算法(3)——直接插入排序算法详解
  7. JS之获取指定位置Unicode的charCodeAt()方法
  8. 转学伯克利计算机科学,转学前往伯克利大学 你够格吗?
  9. 数源思维完成目标设定
  10. vue push 无效_深入浅出Vue响应式原理
  11. html加载本地pdf,WkHTMLtoPDF不加载本地CSS和图像
  12. url中文传参乱码问题
  13. 【渗透测试】IIS6.0的安装、使用与相关漏洞
  14. ABB机器人GSD文件获取的几种方法
  15. Android 4.4 播放器,视频播放器(高清版)
  16. C语言项目-后宫选妃系统-第三天-终结
  17. java软件工程师基本技能_Java软件工程师主要有什么技能
  18. 橡胶密封件老化原因有哪些?
  19. 美通企业周刊 | 爱立信已获100份5G商用合同;北京广东世界五百强数量领跑全国​...
  20. 黑马程序员武汉中心——程序员面试套路集

热门文章

  1. 洛谷2014 选课(树形DP)树形背包问题
  2. [机器学习]超参数优化---贝叶斯优化(Bayesian Optimization) 理解
  3. python中的库及module的 路径
  4. 【Transformer】PoolFormer: MetaFormer is Actually What You Need for Vision
  5. gan简介_GAN简介
  6. 人工智能对金融世界的改变_人工智能革命正在改变网络世界
  7. 范数在机器学习中的作用_设计在机器学习中的作用
  8. 从qplot开始入门
  9. gre tunnel源码分析之接收流程
  10. 欢迎使用CSDN-markdown编辑器2131