Listview滑动时不加载数据,停下来时加载数据,让App更优
2015-10-12 16:24
465 查看
数据源配置(Adapter)
<code class="language-java hljs has-numbering"><span class="hljs-keyword">package</span> com.zhengsonglan.listview_loading.adapter; <span class="hljs-keyword">import</span> android.content.Context; <span class="hljs-keyword">import</span> android.view.LayoutInflater; <span class="hljs-keyword">import</span> android.view.View; <span class="hljs-keyword">import</span> android.view.ViewGroup; <span class="hljs-keyword">import</span> android.widget.BaseAdapter; <span class="hljs-keyword">import</span> android.widget.ImageView; <span class="hljs-keyword">import</span> android.widget.TextView; <span class="hljs-keyword">import</span> com.nostra13.universalimageloader.core.ImageLoader; <span class="hljs-keyword">import</span> com.zhengsonglan.listview_loading.R; <span class="hljs-keyword">import</span> com.zhengsonglan.listview_loading.entity.UserEnity; <span class="hljs-keyword">import</span> java.util.List; <span class="hljs-javadoc">/** * */</span> <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyAdapter</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">BaseAdapter</span> {</span> Context context; LayoutInflater inflater; List<UserEnity> lists; <span class="hljs-keyword">private</span> <span class="hljs-keyword">boolean</span> scrollState=<span class="hljs-keyword">false</span>; <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setScrollState</span>(<span class="hljs-keyword">boolean</span> scrollState) { <span class="hljs-keyword">this</span>.scrollState = scrollState; } <span class="hljs-keyword">public</span> <span class="hljs-title">MyAdapter</span>(Context context, List<UserEnity> lists) { <span class="hljs-keyword">this</span>.context=context; <span class="hljs-keyword">this</span>.inflater=LayoutInflater.from(context); <span class="hljs-keyword">this</span>.lists=lists; } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getCount</span>() { <span class="hljs-keyword">return</span> lists!=<span class="hljs-keyword">null</span>?lists.size():<span class="hljs-number">0</span>; } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> Object <span class="hljs-title">getItem</span>(<span class="hljs-keyword">int</span> position) { <span class="hljs-keyword">return</span> lists.get(position); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">long</span> <span class="hljs-title">getItemId</span>(<span class="hljs-keyword">int</span> position) { <span class="hljs-keyword">return</span> position; } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> View <span class="hljs-title">getView</span>(<span class="hljs-keyword">int</span> position, View convertView, ViewGroup parent) { ViewHolder viewHolder; <span class="hljs-keyword">if</span> (convertView == <span class="hljs-keyword">null</span>) { convertView=inflater.inflate(R.layout.main_item,<span class="hljs-keyword">null</span>,<span class="hljs-keyword">true</span>); viewHolder=<span class="hljs-keyword">new</span> ViewHolder(); viewHolder.iv_icon= (ImageView) convertView.findViewById(R.id.main_item_iv_icon); viewHolder.tv_name= (TextView) convertView.findViewById(R.id.main_item_tv_name); convertView.setTag(viewHolder); } <span class="hljs-keyword">else</span> { viewHolder= (ViewHolder) convertView.getTag(); } UserEnity userEnity=lists.get(position); String img_url=userEnity.getIcon(); <span class="hljs-keyword">if</span> (!scrollState){ viewHolder.tv_name.setText(userEnity.getName()); viewHolder.tv_name.setTag(<span class="hljs-keyword">null</span>); ImageLoader.getInstance().displayImage(img_url,viewHolder.iv_icon); viewHolder.iv_icon.setTag(<span class="hljs-string">"1"</span>); }<span class="hljs-keyword">else</span>{ viewHolder.tv_name.setText(<span class="hljs-string">"加载中"</span>); viewHolder.tv_name.setTag(userEnity.getName()); viewHolder.iv_icon.setTag(img_url); viewHolder.iv_icon.setImageResource(R.mipmap.ic_launcher); } <span class="hljs-keyword">return</span> convertView; } <span class="hljs-keyword">static</span> class ViewHolder{ TextView tv_name; ImageView iv_icon; } } </code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li></ul>
这个Adapter中重要的代码如下:
<code class="language-java hljs has-numbering"><span class="hljs-comment">//定义当前listview是否在滑动状态</span> <span class="hljs-keyword">private</span> <span class="hljs-keyword">boolean</span> scrollState=<span class="hljs-keyword">false</span>; <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setScrollState</span>(<span class="hljs-keyword">boolean</span> scrollState) { <span class="hljs-keyword">this</span>.scrollState = scrollState; }</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>
<code class="language-java hljs has-numbering"><span class="hljs-comment">//实体类</span> UserEnity userEnity=lists.get(position); <span class="hljs-keyword">if</span> (!scrollState){<span class="hljs-comment">//如果当前不是滑动的状态,我们填充真数据</span> <span class="hljs-comment">//填充数据</span> viewHolder.tv_name.setText(userEnity.getName()); <span class="hljs-comment">//设置Tag中数据为空表示数据已填充</span> viewHolder.tv_name.setTag(<span class="hljs-keyword">null</span>); <span class="hljs-comment">//加载图片</span> ImageLoader.getInstance().displayImage(img_url,viewHolder.iv_icon); <span class="hljs-comment">//设置tag为1表示已加载过数据</span> viewHolder.iv_icon.setTag(<span class="hljs-string">"1"</span>); }<span class="hljs-keyword">else</span>{<span class="hljs-comment">//如果当前是滑动的状态,我们填充假数据</span> viewHolder.tv_name.setText(<span class="hljs-string">"加载中"</span>); <span class="hljs-comment">//将数据name保存在Tag当中</span> viewHolder.tv_name.setTag(userEnity.getName()); <span class="hljs-comment">//将数据image_url保存在Tag当中</span> viewHolder.iv_icon.setTag(img_url); <span class="hljs-comment">//设置默认显示图片(最好是本地资源的图片)</span> viewHolder.iv_icon.setImageResource(R.mi bf4a pmap.ic_launcher); }</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li></ul>
设置监听
ok,我们在看看Activity中的代码,主要是监听listview的onscrolllistener方法<code class="language-java hljs has-numbering"><span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onScrollStateChanged</span>(AbsListView view, <span class="hljs-keyword">int</span> scrollState) { <span class="hljs-keyword">switch</span> (scrollState){ <span class="hljs-keyword">case</span> AbsListView.OnScrollListener.SCROLL_STATE_IDLE:<span class="hljs-comment">//停止滚动</span> { <span class="hljs-comment">//设置为停止滚动</span> myAdapter.setScrollState(<span class="hljs-keyword">false</span>); <span class="hljs-comment">//当前屏幕中listview的子项的个数</span> <span class="hljs-keyword">int</span> count = view.getChildCount(); Log.e(<span class="hljs-string">"MainActivity"</span>,count+<span class="hljs-string">""</span>); <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < count; i++) { <span class="hljs-comment">//获取到item的name</span> TextView tv_name = (TextView) view.getChildAt(i).findViewById(R.id.main_item_tv_name); <span class="hljs-comment">//获取到item的头像</span> ImageView iv_show= (ImageView) view.getChildAt(i).findViewById(R.id.main_item_iv_icon); <span class="hljs-keyword">if</span> (tv_name.getTag() != <span class="hljs-keyword">null</span>) { <span class="hljs-comment">//非null说明需要加载数据</span> tv_name.setText(tv_name.getTag().toString());<span class="hljs-comment">//直接从Tag中取出我们存储的数据name并且赋值</span> tv_name.setTag(<span class="hljs-keyword">null</span>);<span class="hljs-comment">//设置为已加载过数据</span> } <span class="hljs-keyword">if</span> (!iv_show.getTag().equals(<span class="hljs-string">"1"</span>)){<span class="hljs-comment">//!="1"说明需要加载数据</span> String image_url=iv_show.getTag().toString();<span class="hljs-comment">//直接从Tag中取出我们存储的数据image——url</span> ImageLoader.getInstance().displayImage(image_url, iv_show);<span class="hljs-comment">//显示图片</span> iv_show.setTag(<span class="hljs-string">"1"</span>);<span class="hljs-comment">//设置为已加载过数据</span> } } <span class="hljs-keyword">break</span>; } <span class="hljs-keyword">case</span> AbsListView.OnScrollListener.SCROLL_STATE_FLING:<span class="hljs-comment">//滚动做出了抛的动作</span> { <span class="hljs-comment">//设置为正在滚动</span> myAdapter.setScrollState(<span class="hljs-keyword">true</span>); <span class="hljs-keyword">break</span>; } <span class="hljs-keyword">case</span> AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:<span class="hljs-comment">//正在滚动</span> { <span class="hljs-comment">//设置为正在滚动</span> myAdapter.setScrollState(<span class="hljs-keyword">true</span>); <span class="hljs-keyword">break</span>; } } }</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li></ul>
最后记得给listview加上滑动的监听
<code class="language-java hljs has-numbering">listview.setOnScrollListener(<span class="hljs-keyword">this</span>);</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>
效果
相关文章推荐
- android之Activity
- Android Studio系列教程三--快捷键
- Android Studio系列教程二--基本设置与运行
- 能挣钱的微信JSSDK+H5混合开发
- 关于操作栏actionBar的添加移除总结
- Android Studio系列教程四--Gradle基础
- 如何将Nios II硬件和软件合成一个文件(NIOS II)(硬件)(软件)(合并)
- Android ImageCropper 矩形 圆形 裁剪框
- Android Binder设计与实现 – 设计篇(二)
- Android与JavaScrpit相互调用
- [原]iOS--字符编码,NSString和UTF-8间的转换
- 浅谈 PHP 与手机 APP 开发(API 接口开发)
- Android Binder设计与实现 - 设计篇
- android客户端学习-button按钮边框及圆角
- iOS新闻客户端开发教程1--项目框架搭建
- android studio 如何更改SDK
- android host修改
- android进程相关的工具类AppUtils
- iOS封装定位类库,可自定义采集精度、超时时间、有效距离等功能
- Xcode 6 正式版如何创建一个Empty Application