Home > php教程 > PHP开发 > body text

Add events to the buttons above each Item in the ListView

高洛峰
Release: 2016-12-13 16:55:42
Original
1341 people have browsed it

Let’s take a look at the renderings first:

Add events to the buttons above each Item in the ListView


This is just for testing. I have written all the data to death. You can modify it yourself as needed. In addition, there are two events to implement the Button on each Item in the ListView. Method:

1. Use final variables to extend the life cycle scope of local variables. Main code (all codes are attached at the end of this article):

//注意原本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();  
    }
Copy after login

2. Use a class to record the position of each Button so that each BUTTON has its own Listener. Main code:

//****************************************第二种方法,高手一般都用此种方法,具体原因,我还不清楚,有待研究  
      
        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;  
    }
Copy after login

3. All codes

1.ListViewActivity.Java All codes:

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();  
    }  
      
      
}
Copy after login

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>
Copy after login
Copy after login

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>
Copy after login
Copy after login

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>
Copy after login

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>
Copy after login

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>
Copy after login

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>
Copy after login

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>
Copy after login


Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Recommendations
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!