為ListView每個Item上面的按鈕新增事件
阿新 • • 發佈:2019-01-24
1.先看下效果圖:
在這裡僅供測試,我把資料都寫死了,根據需要可以自己進行修改,此外實現ListView上面每個Item上的Button的事件有兩種方法:
1.使用final變數擴充套件區域性變數的生命週期範圍主要程式碼(本文最後附全部程式碼):
- //注意原本getView方法中的int position變數是非final的,現在改為final
- @Override
- public View getView(finalint 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
- publicvoid onClick(View v) {
- showInfo(position);
- }
- });
- //holder.viewBtn.setOnClickListener(MyListener(position));
- return convertView;
- }
- }
- //提取出來方便點
- publicfinalclass ViewHolder {
- public TextView title;
- public TextView info;
- public Button viewBtn;
- }
- publicvoid 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
- publicvoid 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;
- }
- }
- privateclass MyListener implements OnClickListener{
- int mPosition;
- public MyListener(int inPosition){
- mPosition= inPosition;
- }
- @Override
- publicvoid onClick(View v) {
- // TODO Auto-generated method stub
- Toast.makeText(ListViewActivity.this, title[mPosition], Toast.LENGTH_SHORT).show();
- }
- }
- //提取出來方便點
- publicfinalclass 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;
- publicclass ListViewActivity extends Activity {
- /** Called when the activity is first created. */
- private List<Map<String, Object>> mData;
- privateint flag;
- publicstatic String title[]=new String[]{"菜名0","菜名1","菜名2","菜名3","菜名4","菜名5","菜名6","菜名7","菜名8","菜名9"};
- publicstatic String info[]=new String[]{ "¥:28","¥:28","¥:28","¥:28","¥:28","¥:28","¥:28","¥:28","¥:28","¥:28",};
- @Override
- publicvoid 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;
- }
- publicclass MyAdapter extends BaseAdapter {
- private LayoutInflater mInflater;
- public MyAdapter(Context context) {
- this.mInflater = LayoutInflater.from(context);
- }
- @Override
- publicint getCount() {
- // TODO Auto-generated method stub
- return mData.size();
- }
- @Override
- public Object getItem(int position) {
- // TODO Auto-generated method stub
- returnnull;
- }
- @Override
- publiclong getItemId(int position) {
- // TODO Auto-generated method stub
- return0;
- }
- //****************************************final方法
- //注意原本getView方法中的int position變數是非final的,現在改為final
- @Override
- public View getView(finalint 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
- publicvoid 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();
- // }
- //
- // }
- //
- //
- //提取出來方便點
- publicfinalclass ViewHolder {
- public TextView title;
- public TextView info;
- public Button viewBtn;
- }
- publicvoid 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
- publicvoid onClick(DialogInterface dialog, int which) {
- }
- })
- .show();
- }
- }
2.main.xml
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns: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
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns: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
- <?xmlversion="1.0"encoding="utf-8"?>
- <selectorxmlns:android="http://schemas.android.com/apk/res/android">
- <itemandroid:drawable="@drawable/btn_detail_normal"android:state_enabled="true"android:state_focused="false"android:state_pressed="false"/>
- <itemandroid:drawable="@drawable/btn_detail_pressed"android:state_enabled="true"android:state_pressed="true"/>
- <itemandroid:drawable="@drawable/btn_detail_pressed"android:state_enabled="true"android:state_focused="true"/>
- </selector>
5.item.xml
- <?xmlversion="1.0"encoding="UTF-8"?>
- <selectorxmlns:android="http://schemas.android.com/apk/res/android">
- <itemandroid:drawable="@drawable/item_higlight"android:state_focused="true"android:state_pressed="false"/>
- <itemandroid:drawable="@drawable/item_higlight"android:state_focused="false"android:state_pressed="true"/>
- <itemandroid:drawable="@drawable/item_higlight"android:state_selected="true"/>
- <itemandroid:drawable="@drawable/item_higlight"android:state_focused="true"/>
- <itemandroid:drawable="@drawable/item_higlight"/>
- </selector>
6.colors.xml
- <?xmlversion="1.0"encoding="UTF-8"?>
- <resources>
- <colorname="region">#8000ff00</color>
- <colorname="listTitle">#ff23323b</color>
- <colorname="text">#ff848f9b</color>
- <colorname="write">#ffffffff</color>
- </resources>
7.values.xml
- <?xmlversion="1.0"encoding="utf-8"?>
- <resources>
- <stringname="hello">Hello World, ListViewActivity!</string>
- <stringname="app_name">ListView</string>
- </resources>
8.drawables.xml
- <?xmlversion="1.0"encoding="UTF-8"?>
- <resources>
- <itemtype="drawable"name="bg">#80000000</item>
- <itemtype="drawable"name="transparent">#00000000</item>
- <itemtype="drawable"name="lightblue">#ffcfe1ed</item>
- <itemtype="drawable"name="readmenu_btn_bg_f">#30ffffff</item>
- <itemtype="drawable"name="readmenu_btn_bg_p">#50ffffff</item>
- <itemtype="drawable"name="blackMask">#30000000</item>
- </resources>