您的位置:首页 > 移动开发

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>

效果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: