Android ListView最佳处理方式,ListView拖动防重复数据显示,单击响应子控件

来源:互联网 发布:netbeans运行java项目 编辑:程序博客网 时间:2024/05/12 10:59

转自:http://blog.csdn.net/boylinux/article/details/8860443


Android ListView最佳处理方式,ListView拖动防重复数据显示,单击响应子控件。


1、为了防止拖动ListView时,在列表末尾重复数据显示。需要加入 HashMap<Integer,View> lmap = new HashMap<Integer,View>();其中Integer为列表位置,View为子项视图,加入数据前首先if (lmap.get(position)==null) ,满足条件时,加入lmap.put(position, convertView);如果条件不满足,convertView = lmap.get(position);

2、监听每个子控件时,一定要加入final int currentPosition=position;这样可以牢牢抓住每次点击的响应位置;最好把控件集成到类中。

[java] view plaincopy
  1. package logic;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.List;  
  5. import java.util.Map;  
  6.   
  7. import logic.PlaceAdapter.ViewHolder;  
  8.   
  9. import org.guiji.BigPictureActivity;  
  10. import org.guiji.ClassUserListActivity;  
  11. import org.guiji.CommentMoodActivity;  
  12. import org.guiji.R;  
  13. import org.guiji.UserHomeActivity;  
  14.   
  15. import support.ClassUserListImageDownloadTask;  
  16. import support.ImageDownloadTask;  
  17. import support.SystemConstant;  
  18. import android.content.Context;  
  19. import android.content.Intent;  
  20. import android.text.Html;  
  21. import android.view.LayoutInflater;  
  22. import android.view.View;  
  23. import android.view.ViewGroup;  
  24. import android.view.View.OnClickListener;  
  25. import android.widget.BaseAdapter;  
  26. import android.widget.ImageView;  
  27. import android.widget.TextView;  
  28.   
  29. public class ClassUserListAdapter extends BaseAdapter {  
  30.     HashMap<Integer,View> lmap = new HashMap<Integer,View>();  
  31.     private LayoutInflater mInflater=null;  
  32.     private List<Map<String, String>> mData=null;  
  33.     private ClassUserListImageDownloadTask imgtask=null;  
  34.     private Context context;  
  35.     public List<Map<String, String>> getmData() {  
  36.         return mData;  
  37.     }  
  38.   
  39.     public void setmData(List<Map<String, String>> mData) {  
  40.         this.mData = mData;  
  41.     }  
  42.     public ClassUserListAdapter(Context context){  
  43.         this.mInflater = LayoutInflater.from(context);  
  44.         this.context=context;  
  45.     }  
  46.     @Override  
  47.     public int getCount() {  
  48.         return mData.size();  
  49.     }  
  50.   
  51.     @Override  
  52.     public Object getItem(int position) {  
  53.         return mData.get(position);  
  54.     }  
  55.   
  56.     @Override  
  57.     public long getItemId(int position) {  
  58.         return position;  
  59.     }  
  60.   
  61.     @Override  
  62.     public View getView(int position, View convertView, ViewGroup parent) {  
  63.         ClassUserListViewHolder holder = null;  
  64.         if (lmap.get(position)==null) {  
  65.             imgtask=new ClassUserListImageDownloadTask();  
  66.               
  67.             convertView = mInflater.inflate(R.layout.classuserlist_item, null);  
  68.             holder=new ClassUserListViewHolder();   
  69.               
  70.             holder.classuserlist_item_userlogo=(ImageView)convertView.findViewById(R.id.classuserlist_item_userlogo);  
  71.             holder.classuserlist_item_username=(TextView)convertView.findViewById(R.id.classuserlist_item_username);  
  72.             holder.classuserlist_item_statuscontent=(TextView)convertView.findViewById(R.id.classuserlist_item_statuscontent);  
  73.             holder.classuserlist_item_idfans1=(TextView)convertView.findViewById(R.id.classuserlist_item_idfans1);  
  74.             holder.classuserlist_item_idfans2=(TextView)convertView.findViewById(R.id.classuserlist_item_idfans2);  
  75.             holder.classuserlist_item_idmood=(TextView)convertView.findViewById(R.id.classuserlist_item_idmood);  
  76.             holder.classuserlist_item_idhuoyuevalue=(TextView)convertView.findViewById(R.id.classuserlist_item_idhuoyuevalue);  
  77.             holder.classuserlist_item_msgpic=(ImageView)convertView.findViewById(R.id.classuserlist_item_msgpic);  
  78.             holder.classuserlist_item_msgcontent=(TextView)convertView.findViewById(R.id.classuserlist_item_msgcontent);  
  79.             holder.classuserlist_item_idtimeplace=(TextView)convertView.findViewById(R.id.classuserlist_item_idtimeplace);  
  80.             holder.classuserlist_item_classbutton=(ImageView)convertView.findViewById(R.id.classuserlist_item_classbutton);  
  81.               
  82.             lmap.put(position, convertView);  
  83.             convertView.setTag(holder);  
  84.               
  85.             holder.classuserlist_item_username.setText((String)mData.get(position).get("username"));  
  86.             if(mData.get(position).get("idstatuscontent")!=null){  
  87.                 holder.classuserlist_item_statuscontent.setText((String)mData.get(position).get("idstatuscontent"));  
  88.                 holder.classuserlist_item_statuscontent.setVisibility(0);  
  89.             }  
  90.             if(mData.get(position).get("idfans1")!=null){  
  91.                 holder.classuserlist_item_idfans1.setText((String)mData.get(position).get("idfans1"));  
  92.                 holder.classuserlist_item_idfans1.setVisibility(0);  
  93.             }  
  94.             if(mData.get(position).get("idfans2")!=null){  
  95.                 holder.classuserlist_item_idfans2.setText((String)mData.get(position).get("idfans2"));  
  96.                 holder.classuserlist_item_idfans2.setVisibility(0);  
  97.             }  
  98.               
  99.             holder.classuserlist_item_idmood.setText((String)mData.get(position).get("idmood"));  
  100.             if(mData.get(position).get("idhuoyuevalue").length()>=4)  
  101.                 holder.classuserlist_item_idhuoyuevalue.setText("活跃值"+"("+mData.get(position).get("idhuoyuevalue").substring(04)+")");  
  102.             else  
  103.                 holder.classuserlist_item_idhuoyuevalue.setText("活跃值"+"("+mData.get(position).get("idhuoyuevalue")+"0"+")");  
  104.               
  105.             if(mData.get(position).get("idmsgcontent")!=null){  
  106.                 holder.classuserlist_item_msgcontent.setText((String)mData.get(position).get("idmsgcontent"));  
  107.                 holder.classuserlist_item_msgcontent.setVisibility(0);  
  108.             }  
  109.             if(mData.get(position).get("idtime")!=null){  
  110.                 holder.classuserlist_item_idtimeplace.setText((String)mData.get(position).get("idtime")+"  "+(String)mData.get(position).get("idplace"));  
  111.                 holder.classuserlist_item_idtimeplace.setVisibility(0);  
  112.             }  
  113.               
  114.             String temp=SystemConstant.baseURLNone+mData.get(position).get("userlogo")+","+  
  115.             SystemConstant.baseURLNone+mData.get(position).get("idmsgpic");  
  116.             imgtask.execute(temp,holder);  
  117.               
  118.         }else {  
  119.             convertView = lmap.get(position);  
  120.             holder = (ClassUserListViewHolder)convertView.getTag();  
  121.         }  
  122.           
  123.         final int currentPosition=position;  
  124.         holder.classuserlist_item_userlogo.setOnClickListener(new OnClickListener() {  
  125.               
  126.             @Override  
  127.             public void onClick(View v) {  
  128.                 MainService.guiji.setCurrentURL(SystemConstant.baseURL+mData.get(currentPosition).get("userLink"));  
  129.                 Intent it=new Intent(context,UserHomeActivity.class);  
  130.                 context.startActivity(it);  
  131.             }  
  132.         });  
  133.           
  134.         holder.classuserlist_item_username.setOnClickListener(new OnClickListener() {  
  135.               
  136.             @Override  
  137.             public void onClick(View v) {  
  138.                 MainService.guiji.setCurrentURL(SystemConstant.baseURL+mData.get(currentPosition).get("userLink"));  
  139.                 Intent it=new Intent(context,UserHomeActivity.class);  
  140.                 context.startActivity(it);  
  141.             }  
  142.         });  
  143.         holder.classuserlist_item_msgpic.setOnClickListener(new OnClickListener() {  
  144.               
  145.             @Override  
  146.             public void onClick(View v) {  
  147.                 MainService.guiji.setCurrentURL(SystemConstant.baseURLNone+mData.get(currentPosition).get("idmsgpic"));  
  148.                 Intent it=new Intent(context,BigPictureActivity.class);  
  149.                 context.startActivity(it);  
  150.             }  
  151.         });  
  152.         holder.classuserlist_item_idfans1.setOnClickListener(new OnClickListener() {  
  153.               
  154.             @Override  
  155.             public void onClick(View v) {  
  156.                 MainService.guiji.deleteReply(SystemConstant.baseURL+mData.get(currentPosition).get("idfans1link"));  
  157.                 ((ClassUserListActivity) context).createTask();  
  158.             }  
  159.         });  
  160.         holder.classuserlist_item_idfans2.setOnClickListener(new OnClickListener() {  
  161.               
  162.             @Override  
  163.             public void onClick(View v) {  
  164.                 MainService.guiji.deleteReply(SystemConstant.baseURL+mData.get(currentPosition).get("idfans2link"));  
  165.                 ((ClassUserListActivity) context).createTask();  
  166.             }  
  167.         });  
  168.           
  169.         holder.classuserlist_item_classbutton.setOnClickListener(new OnClickListener() {  
  170.               
  171.             @Override  
  172.             public void onClick(View v) {  
  173.                 String temp=SystemConstant.baseURL+mData.get(currentPosition).get("idcommentlink");  
  174. //              MainService.guiji.setCurrentURL(temp);  
  175.                 MainService.guiji.setPageType(4);  
  176.                 MainService.guiji.setBackURL(temp);  
  177.                 Intent it=new Intent(context,CommentMoodActivity.class);  
  178.                 context.startActivity(it);  
  179.             }  
  180.         });  
  181.           
  182.         return convertView;  
  183.     }  
  184.     public class ClassUserListViewHolder{  
  185.         public ImageView classuserlist_item_userlogo;  
  186.         public TextView classuserlist_item_username;  
  187.         public TextView classuserlist_item_statuscontent;  
  188.         public TextView classuserlist_item_idfans1;  
  189.         public TextView classuserlist_item_idfans2;  
  190.         public TextView classuserlist_item_idmood;  
  191.         public TextView classuserlist_item_idhuoyuevalue;  
  192.         public ImageView classuserlist_item_msgpic;  
  193.         public TextView classuserlist_item_msgcontent;  
  194.         public TextView classuserlist_item_idtimeplace;  
  195.         public ImageView classuserlist_item_classbutton;  
  196.     }  
  197.   
  198. }  



小巫在这里也扯一句吧:

ListView在开发中是一个经常用的控件,有时候为了扩展更多功能也会用到ExpandableListView,然而数据的正确显示是开发者在实际开发中需要注意的,我在实现ListView的时候,最常遇到的是数据重复显示还有快速滑动的时候数据显示不完整的现象,然而如果在数据量大的时候还涉及到性能和convertView重用的问题。上面的这种处理方式,似乎已经比较好了,我已经验证过,之前滑动列表出现数据重复和显示不完整的现象全都没了。


0 0
原创粉丝点击