zoukankan      html  css  js  c++  java
  • listview用ViewHolder存储控件,避免多次创建寻找空间资源,PopupWindow的使用。

    1、listview写Adapater时候在getview里,用局部定义的view加载的xml后调用findviewbyid(),在oncreate()里调用findviewById时候由于activity往往没有加载listview要加载的Item.xml因此找到的其实为null,从而导致错误。

    2、popupwindow为类成员时候,在oncreate里只能定义一个”空“的popuwindow,即用new PopupWindow(),经测试在oncreate()方法里给popupWindow设置属性都是无效的。并且oncreate()里面不能显示popupwindow,否则报错。

    3、在listview的一个item里存在Button、checkbox或者自己在getview()覆写方法里定义了item里的一个view的监听事件时候,如果再setOnItemClickListener,很可能导致局部view个item抢焦点,而item点击事件失效,经测试下面的demo在真机上失效,模拟器上可用。后修改 为都监听局部view了。

    4、Listview的getview时候每次都得创建item时候有三种方法,1直接创建。2将view存入到convertview参数里;3、为了提高效率可以定义Viewholder将view保存在里面,然后调用setTag(),下次创建item的时候直接用getTag()获取view,设定值,来提高效率;具体方法见代码。

    下面看code:

     main_xml:

    <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"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.example.deomhouxuan.MainActivity$PlaceholderFragment" >
    
        <RelativeLayout
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:id="@+id/QQ"
            >
        <EditText
            android:id="@+id/ed_t"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
    			 />
        <ImageButton 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:background="@drawable/down_arrow"
            android:onClick="imbOnClick"
            android:id="@+id/imb"
            />
    </RelativeLayout>
    
    
    </RelativeLayout>
    

     item_xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="200dp"
        android:layout_height="match_parent"
        >
        <ImageView 
             android:contentDescription="@string/app_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/user"
            android:id="@+id/ima_v"
    		android:layout_margin="5dp"
            />
    	<TextView 
    	    android:layout_width="wrap_content"
    	    android:layout_height="wrap_content"
    	    android:id="@+id/text_v"
    		android:layout_centerHorizontal="true"
    		android:layout_centerVertical="true"
    	    />
    	<ImageView 
    	    android:contentDescription="@string/app_name"
    	    android:layout_width="wrap_content"
    	    android:layout_height="wrap_content"
    	    android:id="@+id/delete"
    	    android:background="@drawable/delete"
    		android:layout_centerVertical="true"
    		android:layout_alignParentRight="true"
    	    />
    </RelativeLayout>
    

    activity

    package com.example.deomhouxuan;
    import java.util.ArrayList;
    import android.app.Activity;
    import android.graphics.drawable.BitmapDrawable;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.EditText;
    import android.widget.ImageView;
    import android.widget.ListView;
    import android.widget.PopupWindow;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
    
    	private EditText ed;
    	private ArrayList<String> data;
    	public ListView list;
    	public PopupWindow popu;
    	MylistAdapter adapter;
    	
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initview();
            
            
        }
        public void initview()
        {
        	ed=(EditText) findViewById(R.id.ed_t);
        	data=new ArrayList<String>();
        	for(int x=0;x<10;x++)
        		data.add(String.valueOf(1234123+x));
        	
        	list=new ListView(this);
        	popu=new PopupWindow();
        	adapter=new MylistAdapter();
        	list.setAdapter(adapter);
    //	   System.out.println(popu==null);
    
        }
    
        public void  imbOnClick(View v) 
       {	
        	//经实验发现:popupwindow除了在主线程内new出一个空对象外,其他的一切 属性设定都是无效的
        	popu.setWidth(ed.getWidth());
      	   popu.setHeight(200);
      	   //设置listview的item之间的线为0;
      	   list.setDividerHeight(0);
      	   popu.setContentView(list);
    	   if(popu.isShowing())
    	   {
    		   popu.dismiss();
    	   }
    	   else
    		   popu.showAsDropDown(ed);
    	   //下面2句是让popup的背后也获取焦点,点击后面时候popup隐藏
    	    popu.setBackgroundDrawable(new BitmapDrawable());
    	    popu.setFocusable(true);
    	    
    	    //在这里设置点击事件时候,由于listitem里的delete跟item争抢角点导致item在模拟器上可以,真机上失效,
    	    //因此为了避免,在getview里定义了监听事件
    //	    list.setFocusable(true);
    //    	list.setOnItemClickListener(new OnItemClickListener() {
    //			@Override
    //			public void onItemClick(AdapterView<?> parent, View view,
    //					int position, long id) {
    //				ed.setText(data.get(position));
    //				
    //				System.out.println(popu==null);				
    //			}
    //		});
        	
       }
        
     class MylistAdapter extends BaseAdapter
       {
    
    	@Override
    	public int getCount() {
    		return data.size();
    	}
    
    	@Override
    	public Object getItem(int position) {
    		
    		return null;
    	}
    
    	@Override
    	public long getItemId(int position) {
    		// TODO Auto-generated method stub
    		return position;
    	}
    
    	@Override
    	public View getView(final int position, View convertView, ViewGroup parent) 
    	{
    		//	最慢的方法,每次创建view,再返回
    //		View v=getLayoutInflater().inflate(R.layout.item, null);
    //		TextView tv=(TextView) v.findViewById(R.id.text_v);
    //		tv.setText(data.get(position));
    //		return v;
    		
    //		//一般的方法,将view存入convertView,下次直接取
    //		if(convertView==null)
    //		{
    //			convertView=getLayoutInflater().inflate(R.layout.item, null);
    //			TextView tv=(TextView) convertView.findViewById(R.id.text_v);
    //			tv.setText(data.get(position));
    //		}
    //		else
    //		{
    //			((TextView)convertView.findViewById(R.id.text_v)).setText(data.get(position));
    //		}
    //		return convertView;
    		
    		//最快的方法
    		ViewHolder viewholder;
    		if(convertView==null)
    		{
    			convertView=getLayoutInflater().inflate(R.layout.item, null);
    			TextView tv=(TextView) convertView.findViewById(R.id.text_v);
    			viewholder=new ViewHolder();
    			viewholder.tv=tv;
    			viewholder.delete=(ImageView) convertView.findViewById(R.id.delete);
    			convertView.setTag(viewholder);
    		}
    		else
    		{
    			viewholder=(ViewHolder) convertView.getTag();
    		}
    		
    		
    		viewholder.tv.setText(data.get(position));
    		
    		//添加点击删除的事件
    		viewholder.delete.setOnClickListener(new OnClickListener(){
    			@Override
    			public void onClick(View v) {
    				data.remove(position);
    				adapter.notifyDataSetChanged();
    			}
    		}
    );
    		//添加点击data的事件
    		viewholder.tv.setOnClickListener(new OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				ed.setText(data.get(position));
    				popu.dismiss();
    			}
    		});
    		return convertView;
    	}
       }
     //静态的VieHolder类存储view对象
     static class ViewHolder
     {
    	 TextView tv;
    	 ImageView delete;
    	 
     }
       
    }
    

      

  • 相关阅读:
    HTTP
    jQuery
    BOM与DOM
    Page类成员
    Web用户自定义控件
    ASP.NET服务端基本控件介绍
    ASP.NET中的验证控件
    ASP.NET数据绑定控件
    ASP.NET中的母版页
    ASP.NET缓存 Cache
  • 原文地址:https://www.cnblogs.com/bokeofzp/p/4767635.html
Copyright © 2011-2022 走看看