Android ListView控件的使用(自定义适配器 + ListView + 解决OOM )

            项目中遇到的问题,上网查阅以及自己思考解决了ListView控件的使用问题,废话不多说,程序运行图如下所示:

                                                                   

       常规的方法我们通常采用的是ListView + SimpleAdapter来实现上述的界面,代码很简单,逻辑很清楚。但是如果我想要点击比如说上方的item条目中的查看视频,查看留言,使它们点击后产生相应的点击事件,也就是弹出你好和再见字样,使用这种方法就行不通了。所以在此我使用另外一种方法 ListView + 自定义适配器

三个实现功能的java类  :                                                  

                                                                  

两个xml布局文件:

                                                                 

 1 activity_main.xml(listview的布局文件):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
   >

    <ListView 
             android:id="@+id/list_view"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
             android:divider="@drawable/seperate1"
                   ></ListView>

</RelativeLayout>

                                          

  item就是上图中画圈的地方,此listview总共有7个item,android:divider 代表的属性是每个item之间的分隔符

  2 zhuangzai_ui.xml(item的布局文件):  

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <LinearLayout 
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:orientation="horizontal"   >
        <ImageView   
                 android:id="@+id/xianshiphoto"
                 
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:background="@drawable/find1"/>  
                 
        <LinearLayout   
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="130.0dip"
                 android:orientation="vertical" 
                   >
             <TextView   
                     
                      android:layout_width="wrap_content"
                      android:layout_height="wrap_content"
                      android:textSize="15sp"
                      android:id="@+id/name"
                      android:text="门铃NJ"
                      android:textColor="#000000"/>
             <TextView   
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textSize="15sp"
                        android:id="@+id/content"
                        android:text="有人长时间逗留"
                            android:textColor="#000000"/>
              <TextView  
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:id="@+id/time"
                         android:textSize="15sp"
                         android:text="2015-9-10 : 13: 56 :11" 
                             android:textColor="#000000"/>
          </LinearLayout>
    </LinearLayout>
    
    <LinearLayout    
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:orientation="horizontal" >
        <ImageView   
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="15.0dip"
                 android:layout_gravity="center_horizontal"
                 android:id="@+id/showphoto"
                 
                 android:background="@drawable/info"/>
        <TextView   
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:textSize="15sp"  
                 
                  android:layout_marginTop="6.0dip"
                  android:id="@+id/checkinfo"
                   android:text="查看留言"
                       android:textColor="#000000"/>
        
        <ImageView    
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:id="@+id/videophoto"
                 android:layout_marginLeft="80.0dip"
                 android:layout_gravity="center_horizontal"
                 android:background="@drawable/video" />
        <TextView   
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:textSize="15sp" 
                  android:layout_marginTop="6.0dip" 
                      android:textColor="#000000"
                  
                  android:id="@+id/checkvideo"
                   android:text="实时视频"/>
    </LinearLayout>
    

</LinearLayout>

这个布局文件会装载到自定义适配器中

3个java类文件

 1 iteminfo.java 用来装载listview每一个item中的信息,item就是上图中画圈的地方,此listview总共有7个item  

package com.example.testlistview;

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



public class iteminfo {
           
	          
	        public   iteminfo(){
	        	
	        }
	    
	        public static List<HashMap<String,Object>> getdate(){
	    		
	        	List<HashMap<String,Object>>  listviewinfo = new ArrayList<HashMap<String,Object>>();
	    		for(int i = 0; i < 7;i++){
	    			HashMap<String , Object> data = new HashMap<String, Object>();
	    			data.put("pitcure", R.drawable.find);
	    			data.put("name", "门铃NJ");
	    		    data.put("introduce", "有人长时间逗留");
	    			data.put("time", "2015-9-15 10:11:40");
	    			data.put("liuyan", R.drawable.info);
	    			data.put("liuyancheck","查看留言");
	    			data.put("video", R.drawable.video);
	    			data.put("videocheck", "查看视频");
	    			listviewinfo.add(data);
	    		}
	    		return listviewinfo;
	        }
}
	
2 myadapter.java 继承于 BaseAdapter(BaseAdapter是Android-SDK中的基类)这里是重点,这是配置每一个item信息的类,属于自定义适配器

package com.example.testlistview;







import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class myadapter  extends BaseAdapter implements OnClickListener{
   
	private LayoutInflater inflater = null ;
  
	private  Context context;
	private   ViewHolder  viewholder;
	
	public   myadapter(){
		   
	   }
	   
	   public   myadapter(Context  context){
		      
		         this.context = context;
		         inflater = LayoutInflater.from(context);
		   
	   }
	   
	   static  class ViewHolder{
		   private TextView  view1;
		    private TextView view2;
		    private TextView view3;
		    private TextView view4;
		    private TextView view5;
			private ImageView  imageview1;
			private ImageView  imageview2;
			private ImageView imageview3;
	   }
	
	
	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return iteminfo.getdate().size();   
	}

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

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return  position;
	}
    
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
	    
		   if(convertView == null){
			     viewholder = new ViewHolder();
			     convertView = inflater.inflate(R.layout.zhuangzai_ui, null);
			    viewholder. view4 = (TextView)convertView.findViewById(R.id.checkinfo);
			    viewholder.  view5 = (TextView)convertView.findViewById(R.id.checkvideo);
			    viewholder. view1 = (TextView)convertView.findViewById(R.id.name);
			    viewholder.   view2 = (TextView)convertView.findViewById(R.id.content);
			    viewholder.   view3 = (TextView)convertView.findViewById(R.id.time);
			    //将设置好的布局保存到缓存中,并将其设置在Tag里,以便后面方便取出Tag
			    convertView.setTag(viewholder);   
		   }
		   else{
			   viewholder = (ViewHolder)convertView.getTag();
		   }
		//填充的数据
		   viewholder.  view1.setText(iteminfo.getdate().get(position).get("name").toString());
		   viewholder. view2.setText(iteminfo.getdate().get(position).get("introduce").toString());
		   viewholder. view3.setText(iteminfo.getdate().get(position).get("time").toString());
		   viewholder. view4.setText(iteminfo.getdate().get(position).get("liuyancheck").toString());
		   viewholder. view5.setText(iteminfo.getdate().get(position).get("videocheck").toString());
		   viewholder. view4.setOnClickListener(this);
		   viewholder. view5.setOnClickListener(this);
		
		
		
		return convertView;
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()) {
		case R.id.checkinfo:
			 Toast.makeText(this.context, "你好", 0).show();
			 break;

		case R.id.checkvideo:
			 Toast.makeText(this.context, "再见", 0).show();
			
			break;
		}
	}
	}

 代码讲述:

  1 在继承BaseAdapter后,会自动给你添加四个方法,需要自己写覆盖原来的,分别为getCount()、getItem()、 getItemId()、getView()。

在这四个方法中getCount ,与getView 是最重要的

 1.1 getCount()方法表示的是这个listview有几个item条目

return iteminfo.getdate().size();   

   这句代码表示的就是获得装载信息集合的大小,在iteminfo中可看出循环了7次,也就是大小是7,item条目有7个

 1.2 getItem() , getItemId()方法表示的是当前item所要绑定的数据在集合中的索引值  

return iteminfo.getdate().get(position);

return  position;
1.3 getView()方法表示的所要加载的界面,从表面上看就是获得视图

  2 在此类中还定义了一个static class ViewHolder 主要是为了解决OOM(内存泄露问题),也就是说在显示listView时,假如listview有成百上千的item,你并不是一次性把这些item生成,而是根据手机屏幕,一次性在手机屏幕上显示的item条目说你能看到的,看不到的并不加载。所以这样就不会出现内存泄露了

3 MainActivity.java

package com.example.testlistview;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;

public class MainActivity extends Activity implements OnItemClickListener {
    
	
	  private    ListView   listview  ;
	 private   myadapter  adapter;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		 listview = (ListView)findViewById(R.id.list_view);
		adapter = new myadapter(getApplicationContext());
		listview.setAdapter(adapter);
		listview.setOnItemClickListener(this);
       
	 
	
	
	}

	
	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position,
			long id) {
		// TODO Auto-generated method stub
		           
	}
	


	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
	
}

以上就是整个代码及讲解,同样的方式还可以用到其它的组件中比如GridView ,AutoCompleteTextView,等等。希望能够得到大家的评论,不足之处会多多改善,大家共同学习。

源代码地址:http://download.youkuaiyun.com/detail/danielntz/9462442

    

  

  

       

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值