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,一经查实,立即删除!

相关文章

c语言编辑输出后汉字乱码,为什么这个程序会输出汉字乱码

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include #include #include #include int main(void){int correct false;char anothergame *Y*;int counter 0;int sequencelength 0;time_t seed 0;int number 0;time_t now 0;int time_taken0;int i1;printf(&qu…

Ctrl+F5不能使用的问题

axure中F5生成整个原型,CtrlF5是生成当前的单个页面。 如果碰到CtrlF5不能生成的情况,则表明当前的页面处在母版页,动态面板的状态页,或者在生成页面中,没有勾选生成所有页面转载于:https://www.cnblogs.com/zlhayden/…

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

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

《修改winXP pro安装界面》 、《修改winXP pro开机画面》、《修改winXP pro登录画面》...

一、《修改winXP pro安装界面》 ---------------------------- 安装界面----也就是安装复制完系统文件,重启进入的安装界面,这个界面停留的时间较长,值得一改以 供欣赏,复制完winXP pro的安装文件到硬盘上后,点击“i38…

单实例单向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…

int0低电平触发c语言,单片机中断的解释.ppt

单片机中断的解释在CPU和外设交换信息时,存在着快速CPU和慢速外设间的矛盾,机器内部有时也可能出现突发事件,为此,计算机中通常采用中断技术。 中断 CPU和外设并行工作,当外设数据准备好( 或有某种突发事件发生)时向CP…

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

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

js 字符ascii码转换函数

字符转ascii码&#xff1a;用charCodeAt();ascii码砖字符&#xff1a;用fromCharCode(); 看一个小例子<script>str"A";code str.charCodeAt(); str2 String.fromCharCode(code);str3 String.fromCharCode(0x6026);document.write(code<br />);documen…

【生活智慧】005.信守诺言的约束

《塔木德》指出&#xff0c;信守诺言的约束&#xff0c;重视集体的力量&#xff0c;永远怀着必胜的信念的等&#xff0c;都有助于一个人获得成功。 下面的故事生动地诠释了这些使很多犹太人受益一生的原则。 丛林中走出了四个男人&#xff0c;他们蓬头垢面&#xff0c;衣衫褴褛…

python c 语言接口,## 人生苦短我用python[0x08] 使用ctypes调用c语言接口 ##

文章内容为原创&#xff0c;欢迎转载请注明出处作者&#xff1a; EflyPro->晦明禅师1.背景python作为解析语言大规模应用在各个领域&#xff0c;c语言作为系统级别的语言广泛应用在基础&#xff0c;系统&#xff0c;网络等底层服务当中&#xff0c;可以说python和c语言之间各…

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

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

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

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

XML 测验

您的回答&#xff1a; 1.XML指的是&#xff1f; 您的回答&#xff1a;eXtensible Markup Language 2.XML对数据进行描述的方式是&#xff1f; 您的回答&#xff1a;XML使用描述节点类描述数据 正确答案&#xff1a;XML使用DTD来描述数据 3.XML的目标是取代HTML 您的回答&#x…

【unity3d游戏开发之基础篇】利用射线实现鼠标控制角色转向和移动(角色移动一)...

由于最近搞2D游戏&#xff0c; 下面的代码配合NGUI来使用 。。。 将代码拖到角色身上就OK&#xff0c; 实现了角色转向、移动 &#xff0c;想看效果的可以将代码下下来~ 用到了向量来计算角度 以及方向&#xff0c; 得恶补下向量知识了 。。。 代码参考&#xff1a; 1 using…

QtCreator添加图片资源

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

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

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

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

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

c语言输出去掉最后一行回车,新人提问:如何将输出时每行最后一个空格删除...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼如何将每行最后一个空格删除&#xff0c;使矩阵只有数字间有空格&#xff0c;没有多余空格&#xff1f;#include#includeint main(){int i,j,k,m,n,x,h,y;int a[15][15]{0};while(scanf("%d",&i)){k1;for(n1;n<i;…

评论时间戳格式化

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

在.net3.5中使用ListView控件和DataPager控件笔记

演练&#xff1a;使用 ListView Web 服务器控件修改数据 演练&#xff1a;使用 ListView Web 服务器控件对数据进行显示、分页和排序 DataPager 控件 注意DataPager控件只能和ListView控件使用,不能和其他数据绑定控件使用! 以下ListView 里面的代码都是按照上面链接里面说的步…