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

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

                                        Android ListView控件的使用(自定义适配器 + ListView + 解决OOM )_第1张图片                           

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

三个实现功能的java类  :                                                  

                                                                  

两个xml布局文件:

                                                                 

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



    


                                          Android ListView控件的使用(自定义适配器 + ListView + 解决OOM )_第2张图片

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

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



    
    
          
                 
        
             
             
              
          
    
    
    
        
        
        
        
        
    
    

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

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> getdate(){
	    		
	        	List>  listviewinfo = new ArrayList>();
	    		for(int i = 0; i < 7;i++){
	    			HashMap data = new HashMap();
	    			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.csdn.net/detail/danielntz/9462442

    

  

  

       

       

你可能感兴趣的:(Android,开发)