android为ListView每个Item上面的按钮添加事件

本文介绍了ListView给每个Item上面的按钮添加事件,具体如下:

1.先看下效果图:
在这里仅供测试,我把数据都写死了,根据需要可以自己进行修改,此外实现ListView上面每个Item上的Button的事件有两种方法:

1.使用final变量扩展局部变量的生命周期范围主要代码(本文最后附全部代码):

//注意原本getView方法中的int position变量是非final的,现在改为final
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
       ViewHolder holder = null;
      if (convertView == null) { 

        holder=new ViewHolder();  

        //可以理解为从vlist获取view 之后把view返回给ListView
        convertView = mInflater.inflate(R.layout.vlist, null);
        holder.title = (TextView)convertView.findViewById(R.id.title);
        holder.info = (TextView)convertView.findViewById(R.id.info);
        holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);
        convertView.setTag(holder);
      }else {
        holder = (ViewHolder)convertView.getTag();
      }     

      holder.title.setText((String)mData.get(position).get("title"));
      holder.info.setText((String)mData.get(position).get("info"));
      holder.viewBtn.setTag(position);
      //给Button添加单击事件 添加Button之后ListView将失去焦点 需要的直接把Button的焦点去掉
      holder.viewBtn.setOnClickListener(new View.OnClickListener() { 

        @Override
        public void onClick(View v) {
          showInfo(position);
        }
      }); 

      //holder.viewBtn.setOnClickListener(MyListener(position)); 

      return convertView;
    }
  } 

  //提取出来方便点
  public final class ViewHolder {
    public TextView title;
    public TextView info;
    public Button viewBtn;
  }
  public void showInfo(int position){ 

    ImageView img=new ImageView(ListViewActivity.this);
    img.setImageResource(R.drawable.b);
    new AlertDialog.Builder(this).setView(img)
    .setTitle("详情"+position)
    .setMessage("菜名:"+title[position]+"  价格:"+info[position])
    .setPositiveButton("确定", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
      }
    })
    .show();
  }

2.使用类记录每个Button的位置,使每个BUTTON都有自己的Listener主要代码:

//****************************************第二种方法,高手一般都用此种方法,具体原因,我还不清楚,有待研究 

    public View getView(int position, View convertView, ViewGroup parent) {
       ViewHolder holder = null;
       MyListener myListener=null;
      if (convertView == null) { 

        holder=new ViewHolder();  

        //可以理解为从vlist获取view 之后把view返回给ListView
         myListener=new MyListener(position); 

        convertView = mInflater.inflate(R.layout.vlist, null);
        holder.title = (TextView)convertView.findViewById(R.id.title);
        holder.info = (TextView)convertView.findViewById(R.id.info);
        holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);
        convertView.setTag(holder);
      }else {
        holder = (ViewHolder)convertView.getTag();
      }     

      holder.title.setText((String)mData.get(position).get("title"));
      holder.info.setText((String)mData.get(position).get("info"));
      holder.viewBtn.setTag(position);
      //给Button添加单击事件 添加Button之后ListView将失去焦点 需要的直接把Button的焦点去掉
      holder.viewBtn.setOnClickListener( myListener); 

      //holder.viewBtn.setOnClickListener(MyListener(position)); 

      return convertView;
    }
  } 

   private class MyListener implements OnClickListener{
      int mPosition;
      public MyListener(int inPosition){
        mPosition= inPosition;
      }
      @Override
      public void onClick(View v) {
        // TODO Auto-generated method stub
        Toast.makeText(ListViewActivity.this, title[mPosition], Toast.LENGTH_SHORT).show();
      } 

    } 

  //提取出来方便点
  public final class ViewHolder {
    public TextView title;
    public TextView info;
    public Button viewBtn;
  }

3.全部代码

1.ListViewActivity.Java全部代码:

package ms.ListView; 

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; 

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast; 

public class ListViewActivity extends Activity {
  /** Called when the activity is first created. */
  private List<Map<String, Object>> mData;
  private int flag;
  public static String title[]=new String[]{"菜名0","菜名1","菜名2","菜名3","菜名4","菜名5","菜名6","菜名7","菜名8","菜名9"};
  public static String info[]=new String[]{ "¥:28","¥:28","¥:28","¥:28","¥:28","¥:28","¥:28","¥:28","¥:28","¥:28",}; 

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    mData = getData();
    ListView listView = (ListView) findViewById(R.id.listView);
    MyAdapter adapter = new MyAdapter(this);
    listView.setAdapter(adapter); 

  } 

  //获取动态数组数据 可以由其他地方传来(json等)
  private List<Map<String, Object>> getData() {
    List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
for(int i=0;i<title.length;i++){
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("title", title[i]);
    map.put("info", info[i]);
    list.add(map);
} 

    return list;
  } 

  public class MyAdapter extends BaseAdapter { 

    private LayoutInflater mInflater; 

    public MyAdapter(Context context) {
      this.mInflater = LayoutInflater.from(context);
    } 

    @Override
    public int getCount() {
      // TODO Auto-generated method stub
      return mData.size();
    } 

    @Override
    public Object getItem(int position) {
      // TODO Auto-generated method stub
      return null;
    } 

    @Override
    public long getItemId(int position) {
      // TODO Auto-generated method stub
      return 0;
    }
    //****************************************final方法
//注意原本getView方法中的int position变量是非final的,现在改为final
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
       ViewHolder holder = null;
      if (convertView == null) { 

        holder=new ViewHolder();  

        //可以理解为从vlist获取view 之后把view返回给ListView 

        convertView = mInflater.inflate(R.layout.vlist, null);
        holder.title = (TextView)convertView.findViewById(R.id.title);
        holder.info = (TextView)convertView.findViewById(R.id.info);
        holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);
        convertView.setTag(holder);
      }else {
        holder = (ViewHolder)convertView.getTag();
      }     

      holder.title.setText((String)mData.get(position).get("title"));
      holder.info.setText((String)mData.get(position).get("info"));
      holder.viewBtn.setTag(position);
      //给Button添加单击事件 添加Button之后ListView将失去焦点 需要的直接把Button的焦点去掉
      holder.viewBtn.setOnClickListener(new View.OnClickListener() { 

        @Override
        public void onClick(View v) {
          showInfo(position);
        }
      }); 

      //holder.viewBtn.setOnClickListener(MyListener(position)); 

      return convertView;
    }
  }
    //****************************************第二种方法,高手一般都用此种方法,具体原因,我还不清楚,有待研究 

//   public View getView(int position, View convertView, ViewGroup parent) {
//      ViewHolder holder = null;
//      MyListener myListener=null;
//     if (convertView == null) {
//
//       holder=new ViewHolder();
//
//       //可以理解为从vlist获取view 之后把view返回给ListView
//        myListener=new MyListener(position);
//
//       convertView = mInflater.inflate(R.layout.vlist, null);
//       holder.title = (TextView)convertView.findViewById(R.id.title);
//       holder.info = (TextView)convertView.findViewById(R.id.info);
//       holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);
//       convertView.setTag(holder);
//     }else {
//       holder = (ViewHolder)convertView.getTag();
//     }
//
//     holder.title.setText((String)mData.get(position).get("title"));
//     holder.info.setText((String)mData.get(position).get("info"));
//     holder.viewBtn.setTag(position);
//     //给Button添加单击事件 添加Button之后ListView将失去焦点 需要的直接把Button的焦点去掉
//     holder.viewBtn.setOnClickListener( myListener);
//
//     //holder.viewBtn.setOnClickListener(MyListener(position));
//
//     return convertView;
//   }
// }
//
//  private class MyListener implements OnClickListener{
//     int mPosition;
//     public MyListener(int inPosition){
//       mPosition= inPosition;
//     }
//     @Override
//     public void onClick(View v) {
//       // TODO Auto-generated method stub
//       Toast.makeText(ListViewActivity.this, title[mPosition], Toast.LENGTH_SHORT).show();
//     }
//
//   }
//
//  

  //提取出来方便点
  public final class ViewHolder {
    public TextView title;
    public TextView info;
    public Button viewBtn;
  }
  public void showInfo(int position){ 

    ImageView img=new ImageView(ListViewActivity.this);
    img.setImageResource(R.drawable.b);
    new AlertDialog.Builder(this).setView(img)
    .setTitle("详情"+position)
    .setMessage("菜名:"+title[position]+"  价格:"+info[position])
    .setPositiveButton("确定", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
      }
    })
    .show();
  } 

}

2.main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical" > 

  <ListView
    android:id="@+id/listView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:divider="@drawable/list_line"
    android:dividerHeight="1dip" /> 

</LinearLayout>

3.vlist.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical" > 

  <ListView
    android:id="@+id/listView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:divider="@drawable/list_line"
    android:dividerHeight="1dip" /> 

</LinearLayout> 

4.btn_detail_selecter.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

  <item android:drawable="@drawable/btn_detail_normal" android:state_enabled="true" android:state_focused="false" android:state_pressed="false"/>
  <item android:drawable="@drawable/btn_detail_pressed" android:state_enabled="true" android:state_pressed="true"/>
  <item android:drawable="@drawable/btn_detail_pressed" android:state_enabled="true" android:state_focused="true"/> 

</selector>

5.item.xml

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

  <item android:drawable="@drawable/item_higlight" android:state_focused="true" android:state_pressed="false"/>
  <item android:drawable="@drawable/item_higlight" android:state_focused="false" android:state_pressed="true"/>
  <item android:drawable="@drawable/item_higlight" android:state_selected="true"/>
  <item android:drawable="@drawable/item_higlight" android:state_focused="true"/>
  <item android:drawable="@drawable/item_higlight"/> 

</selector> 

6.colors.xml

<?xml version="1.0" encoding="UTF-8"?>
<resources>
  <color name="region">#8000ff00</color>
  <color name="listTitle">#ff23323b</color>
  <color name="text">#ff848f9b</color>
  <color name="write">#ffffffff</color>
</resources>

7.values.xml

<?xml version="1.0" encoding="utf-8"?>
<resources> 

  <string name="hello">Hello World, ListViewActivity!</string>
  <string name="app_name">ListView</string> 

</resources> 

8.drawables.xml

<?xml version="1.0" encoding="UTF-8"?>
<resources>
  <item type="drawable" name="bg">#80000000</item>
  <item type="drawable" name="transparent">#00000000</item>
  <item type="drawable" name="lightblue">#ffcfe1ed</item>
  <item type="drawable" name="readmenu_btn_bg_f">#30ffffff</item>
  <item type="drawable" name="readmenu_btn_bg_p">#50ffffff</item>
  <item type="drawable" name="blackMask">#30000000</item>
</resources> 

源码下载:源码下载地址

原文链接:http://blog.csdn.net/qq435757399/article/details/8256453

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android ListView的OnItemClickListener详解

    我们在使用ListView的时候,一般都会为ListView添加一个响应事件android.widget.AdapterView.OnItemClickListener.本文主要在于对OnItemClickListener的position和id参数做详细的解释,我相信有些人在这上面走了些弯路. 先来看一下官方的文档 position The position of the view in the adapter. id The row id of the item that was click

  • Android 中ListView的Item点击事件失效的快速解决方法

    在平常的开发过程中,我们的ListView可能不只是简单的显示下文本或者按钮,更多的是显示复杂的布局,这样的话,我们就得自己写布局和自定义adapter了,一般是继承于BaseAdapter,示例代码见下方.写ListView的点击事件时OnItemClickListener,onItemClick方法没有执行,导致ListView中Item条目点击事件失效,而Item中的View点击事件可以在getView方法中进行处理.导致整个Item点击失效的原因多半是由于在[你自己定义的Item中存在诸

  • Android中Listview点击item不变颜色及设置listselector 无效的解决方案

    这是同一个问题,Listview中点击item是会变颜色的,因为listview设置了默认的listselector,有一个默认的颜色,同理如果点击没颜色变化我们怎么设置listselector也不会变颜色的. 但是在我们的开发过程中,我们可能会碰到这样的问题listview点击不变颜色,总结了一下大概有这几种原因: 1.item的layout设置background颜色值,去掉背景颜色即可 2.listview中listselector属性的效果被覆盖了,比如列表的Item为一个占满单元格的I

  • Android基于ViewDragHelper仿QQ5.0侧滑界面效果

    QQ5.0侧滑效果实现方案有很多方式,今天我们使用ViewDragHelper来实现一下. 先上效果图: ①自定义控件SlidingMenu继承FrameLayout,放在FrameLayout上面的布局一层叠着者一层,通过getChildAt()可以很方便的获取到任意一层,进而控制此布局的变化. public class SlidingMenu extends FrameLayout { private ViewDragHelper mViewDragHelper; private int m

  • Android使用ViewDragHelper实现QQ6.X最新版本侧滑界面效果实例代码

    (一).前言: 这两天QQ进行了重大更新(6.X)尤其在UI风格上面由之前的蓝色换成了白色居多了,侧滑效果也发生了一些变化,那我们今天来模仿实现一个QQ6.X版本的侧滑界面效果.今天我们还是采用神器ViewDragHelper来实现. 本次实例具体代码已经上传到下面的项目中,欢迎各位去star和fork一下. https://github.com/jiangqqlmj/DragHelper4QQ FastDev4Android框架项目地址:https://github.com/jiangqqlm

  • Android使用ListView批量删除item的方法

    本文实例讲述了Android使用ListView批量删除item的方法.分享给大家供大家参考,具体如下: 利用CheckBox选中一个或多个item,最后批量删除它们. 程序运行效果图如下:   下面开始上码: (代码已更正,已解决滚动时紊乱的问题) package com.test.adapter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;

  • Android 中通过ViewDragHelper实现ListView的Item的侧拉划出效果

    先来看看,今天要实现的自定义控件效果图: 关于ViewDragHelper的使用,大家可以先看这篇文章ViewDragHelper的使用介绍 实现该自定义控件的大体步骤如下: 1.ViewDragHelper使用的3部曲,初始化ViewDragHelper,传递触摸事件,实现ViewDragHelper.Callback抽象类. 2.需要创建2个直接的子View,分别是前景View和背景View,代表ListView每一项Item的布局的组成,如下所示: 未划出时显示的FrontView: 划出

  • Android使用ViewDragHelper实现仿QQ6.0侧滑界面(一)

    QQ是大家离不开的聊天工具,方便既实用,自从qq更新至6.0之后,侧滑由原来的划出后主面板缩小变成了左右平滑,在外观上有了很大的提升,于是我就是尝试理解下里面的各种逻辑,结合相关资料,研究研究. 知道这里面的一个主要类是ViewDragHelper,那么首先我们要先来了解一下这个ViewDragHelper类,正所谓打蛇打七寸,我们就先来看看官方文档怎么介绍的,有什么奇特的功能. 首先继承: java.lang.Object android.support.v4.widget.ViewDragH

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

    本文实例讲述了Android实现带有边框的ListView和item的方法.分享给大家供大家参考,具体如下: 想为ListView和item四周添加边框有两种方法: 1.贴一张带有边框效果的背景图 2.自定义Draw的方法 第一种方法较第二种方法更耗系统资源,但是用法简单,只需要一张图设置为相应控件的背景即可,而第二种灵活性好些. 这次是实现带有边框的ListView和item,为此写个简单Demo 学习学习 先看下Demo运行效果吧 下面是主要代码,主要是用到Canvas.drawLine(.

  • android为ListView每个Item上面的按钮添加事件

    本文介绍了ListView给每个Item上面的按钮添加事件,具体如下: 1.先看下效果图: 在这里仅供测试,我把数据都写死了,根据需要可以自己进行修改,此外实现ListView上面每个Item上的Button的事件有两种方法: 1.使用final变量扩展局部变量的生命周期范围主要代码(本文最后附全部代码): //注意原本getView方法中的int position变量是非final的,现在改为final @Override public View getView(final int posit

  • Android自定义listview布局实现上拉加载下拉刷新功能

    listview实现上拉加载以及下拉刷新的方式有很多.下面是我写的一种自定义的布局,复用性也比较的强.首先就是继承的listview的自定义view.   AutoListView.Java: package com.example.mic.testdemo.view; import android.annotation.TargetApi; import android.content.Context; import android.os.Build; import android.os.Bu

  • Android中ListView的item点击没有反应的解决方法

    如果stu_item.xml里面包括button或者checkbox等控件,默认情况下list的item会失去焦点,导致无法响应item的事件,最常用的解决办法是在stu_item.xml的布局文件中设置descendantFocusability属性. 该属性是当一个为view获取焦点时,定义viewGroup和其子控件两者之间的关系. 属性的值有三种: beforeDescendants:viewgroup会优先其子类控件而获取到焦点 afterDescendants:viewgroup只有

  • VC实现给窗体的一个按钮添加事件的方法

    本文实例讲述了VC实现给窗体的一个按钮添加事件的方法.分享给大家供大家参考.具体实现方法如下: 1. 在MainFrm.h中 复制代码 代码如下: // Generated message map functions 添加: 复制代码 代码如下: afx_msg void OnSelectRed(); //声明事件名称 2. MainFrm.cpp中 复制代码 代码如下: BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) 下面 添加: 复制代码 代码如下: ON_

  • Android编程实现ListView中item部分区域添加点击事件功能

    本文实例讲述了Android编程实现ListView中item部分区域添加点击事件功能.分享给大家供大家参考,具体如下: 需求如题目:Android listview中item部分区域添加点击事件,在一个界面显示了listview,但显示的内容分为上下两部分,分别是白色的背景和蓝色的背景,现在需要只点击蓝色的背景,才能跳转到其他界面,解决方式如下: 一开始想着是不是能在list item的布局给上层布局添加一个: android:clickable="false" android:fo

  • Android 使用jQuery实现item点击显示或隐藏的特效的示例

    本文介绍了Android 使用jQuery实现item点击显示或隐藏的特效的示例,分享给大家,具体如下: 效果图 分析 上图中的功能在很多APP上都可能用到过,例如app的帮助界面,告诉用户如何使用APP 一般的实现方式都是通过ListView来实现的,实际上此类需求非常简单,完全可以用WebView加载HTML来实现 抽屉样式的显示隐藏特效可以使用jQuery来实现,一个函数就可以搞定 实现 集成jQuery 网页中需要使用到jQuery,最新版本可以去官网下载 http://jquery.c

  • Android使用自定义alertdialog实现确认退出按钮

    有时候我们需要在游戏或应用中用一些符合我们样式的提示框(AlertDialog),以下是我在开发一个小游戏中总结出来的.希望对大家有用. 先上效果图: 下面是用到的背景图或按钮的图片 经过查找资料和参考了一下例子后才知道,要实现这种效果很简单.就是在设置alertDialog的contentView. 以下的代码是写在Activity下的,代码如下: public boolean onKeyDown(int keyCode, KeyEvent event) { // 如果是返回键,直接返回到桌面

  • vue项目中应用ueditor自定义上传按钮功能

    由于上传地址问题,需要自定义上传按钮,效果如图 由于在页里面没有操作dom,所以想到了用vue的 自定义事件绑定$emit .$on来把点击事件传递给ueditor. 首先是给ueditor添加自定义按钮: 1,打开ueditor.all.js,找到btnCmds,大概在27854行,如下图,在数组添加一个自定义的按钮名称,我写的是"love" ueditor.all.js 2,给按钮添加事件 还是在ueditor.all.js文件内找到commands指令 给刚才定义的按钮扩展事件,

  • Android Listview多tab上滑悬浮效果

    样例 近期要做一个含有两个tab切换页面,两个页面有公共的描述信息区域,两个tab都是listview,可以向上或向下拉动刷新,在页面中部有一个tab切换区域,向上滑动的时候tab区域到顶部后就不在移动,向下拉又重新回到初始位置,先看一样样式图吧! 整个需求大致如上图所示,其中上拉刷新和下拉刷新没有截图,采用了开源控件PullToRefreshListView来实现这个效果. 实现方式 总体思路,为了简单不想监控很多手势问题,因此投机取巧的采用下面的方式来实现, a. 整个页面是一个listvi

随机推荐