Android开发 在ListView中添加控件

     在android课程项目开发过程中,我们小组需要展现一个列表,在列表中实现相对应栏目的编辑等功能,这也就出现了在列表中添加控件的问题。众所周知,android开发中的列表使用ListView实现的,在ListView中针对每个选项添加控件,通过查找相关资料,我找到一种比较通用的办法,介绍如下:

    首先,需要为列表控件新写一个xml布局文件,在这个布局文件中定义列表中一行需要展现的内容,比如每一列中添加TextView,Button等控件;

    接下来,在主界面xml布局文件中定义ListView控件;

    最后在activity文件中定义相关操作,这里的主要思路为:首先编写一个final类ViewHolder,在这个类中定义列表每一行将要实现的控件;然后定义MyAdapter,编写子类的构造方法。同时,MyAdapter类继承基类BaseAdapter,覆写基类中的getCount()、getItem(int arg0)、getItemId(int arg0)、getView(int position, View convertView, ViewGroup parent)等方法。getCount方法返回列表选项的数目、getItem返回列表的选项、getItemId返回列表选项的id。在这几个方法中,最重要的就是最后一个getView方法,它将ViewHolder类中的控件动态加入到ListView中。

    整个代码部分如下所示:

    列表控件布局vlist.xml:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
	<TextView android:id="@+id/goodname"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:layout_weight="1"
	    />
	<TextView android:id="@+id/goodprice"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:layout_weight="1"
	    />
	<TextView android:id="@+id/goodlocation"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:layout_weight="1"
	    />
	<Button
	    android:id="@+id/editButton"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:focusable="false"           
	    android:focusableInTouchMode="false"           
	    android:clickable="false" 
	    android:text="@string/edit"
	    android:layout_gravity="center|right" 
    />
	<Button
	    android:id="@+id/deleteButton"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:focusable="false"           
	    android:focusableInTouchMode="false"           
	    android:clickable="false" 
	    android:text="@string/delete"
	    android:layout_gravity="center|right" 
    />
</LinearLayout>


主界面list.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" >
	<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    	android:layout_width="wrap_content"
    	android:layout_height="wrap_content"
    	android:orientation="horizontal">
	<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:orientation="vertical" >
	    <TextView android:id="@+id/gooddescription"
		    android:layout_width="wrap_content"
		    android:layout_height="wrap_content"
		    android:text="@string/showmygoods"
		    />
	    <TextView
		    android:layout_width="wrap_content"
		    android:layout_height="wrap_content"
		    android:text="@string/detail"
		    />
	</LinearLayout>
	<Button
	    android:id="@+id/returnButton"
	    android:layout_width="120dp"
	    android:layout_height="wrap_content"
	    android:layout_alignParentRight="true" 
	    android:text="@string/returnButton"
    />
</RelativeLayout>
<ListView            
        android:id="@+id/lv"            
        android:layout_width="fill_parent"            
        android:layout_height="wrap_content"
        />     
</LinearLayout>


动态MyGoodsActivity.java:


package com.pku.activity;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MyGoodsActivity extends Activity {
	/**
	 * @查看我发布的商品
	 */
    private List<Map<String, Object>> mData;    
    private ListView mListView;
    
    @Override    
    public void onCreate(Bundle savedInstanceState) {        
    	super.onCreate(savedInstanceState);
    	setContentView(R.layout.list);
    	mListView=(ListView)findViewById(R.id.lv); 
    	returnButton = (Button)findViewById(R.id.returnButton);
    	returnButton.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				//返回上层界面(用户中心)
				Intent intent = new Intent(MyGoodsActivity.this,MyInfoActivity.class);
				startActivity(intent);
			}
		});   
    	MyAdapter adapter = new MyAdapter(this);       
    	mListView.setAdapter(adapter); 
    	mListView.setItemsCanFocus(false);
    	mListView.setOnItemClickListener(new OnItemClickListener(){                
    		@Override                
    		public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
				//点击列表中栏目发生的事件
    			Toast.makeText(MyGoodsActivity.this, "商品描述:" + (String)mData.get(position).get("gooddescription"), Toast.LENGTH_LONG).show();               
    		}            
    	}); 
    }
    
    //初始化        
    private void init() {            
    	mData=new ArrayList<Map<String, Object>>();
    	Map<String, Object> map = new HashMap<String, Object>();        
    	map.put("goodname", "G1");        
    	map.put("goodprice", "100");        
    	map.put("goodlocation", "location 1"); 
    	map.put("gooddescription", "google 1");
    	mData.add(map);         
    	map = new HashMap<String, Object>();        
    	map.put("goodname", "G2");        
    	map.put("goodprice", "200");        
    	map.put("goodlocation", "location 2");
    	map.put("gooddescription", "google 1");
    	mData.add(map);         
    	map = new HashMap<String, Object>();        
    	map.put("goodname", "G3");        
    	map.put("goodprice", "300");        
    	map.put("goodlocation", "location 3");  
    	map.put("gooddescription", "google 3");
    	mData.add(map);
    }
    
    public final class ViewHolder{        
    		public TextView goodname;               
    		public TextView goodprice;
    		public TextView goodlocation;
    		public Button editButton;  
    		public Button deleteButton;    
    		} 
    	
    public class MyAdapter extends BaseAdapter{         
    	private LayoutInflater mInflater; 
    	
    	public MyAdapter(Context context){            
    			this.mInflater = LayoutInflater.from(context);  
    			init(); 
    	}        
    		
    	@Override        
    	public int getCount() {            
    		// TODO Auto-generated method stub           
    		return mData.size();       
    	}  
    	
    	@Override           			
    	public Object getItem(int arg0) {            
    		// TODO Auto-generated method stub            
    		return null;       
    	}         
    	
    	@Override        
    	public long getItemId(int arg0) {            
    		// TODO Auto-generated method stub            
    		return 0;        
    	}         
    	
    	@Override        
    	public View getView(int position, View convertView, ViewGroup parent) {                         
    		ViewHolder holder = null;            
    		if (convertView == null) {                                 
    			holder=new ViewHolder();                                   
    			convertView = mInflater.inflate(R.layout.vlist, null);                
    			holder.goodname = (TextView)convertView.findViewById(R.id.goodname);                               
    			holder.goodprice = (TextView)convertView.findViewById(R.id.goodprice);
    			holder.goodlocation = (TextView)convertView.findViewById(R.id.goodlocation); 
    			holder.editButton = (Button)convertView.findViewById(R.id.editButton);
    			holder.deleteButton = (Button)convertView.findViewById(R.id.deleteButton);
    			convertView.setTag(holder);                             
    			}else {                                 
    				holder = (ViewHolder)convertView.getTag();            
    			}                                      
    		holder.goodname.setText((String)mData.get(position).get("goodname"));
    		holder.goodprice.setText((String)mData.get(position).get("goodprice"));            
    		holder.goodlocation.setText((String)mData.get(position).get("goodlocation"));                         
    		holder.editButton.setOnClickListener(new View.OnClickListener() {                                 
    			@Override                
    			public void onClick(View v) {                    
    				//编辑商品信息                                 
    				}            
    			});  
    		holder.deleteButton.setOnClickListener(new View.OnClickListener() {                                 
    			@Override                
    			public void onClick(View v) {                    
    				//删除商品信息                                 
    				}            
    			}); 
    		return convertView;        
    	}            
    }           
    private Button returnButton;
}



最终实现的界面如下:




版权声明:本文为pku_android原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。