当前位置:操作系统 > 安卓/Android >>

Android开源代码解读のOnScrollListener实现ListView滚屏时不加载数据

使用ListView过程中,如果滚动加载数据的操作比较费时,很容易在滚屏时出现屏幕卡住的现象,一个解决的办法就是不要在滚动时加载数据,而是等到滚动停止后再进行数据的加载。这同样要实现OnScrollListener接口,关于该接口的简要描述见上一篇文章,这里直接进行代码的分析:
[java]
package hust.iprai.asce1885; 
 
import android.app.ListActivity; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AbsListView; 
import android.widget.AbsListView.OnScrollListener; 
import android.widget.BaseAdapter; 
import android.widget.TextView; 
 
public class MainActivity extends ListActivity implements OnScrollListener { 
     
    private TextView mStatus; //显示滚屏状态 
    private boolean mBusy = false; //标识是否存在滚屏操作 
     
    /**
     * 自定义Adapter,实现ListView中view的显示
     *
     */ 
    private class SlowAdapter extends BaseAdapter { 
        private LayoutInflater mInflater; 
         
        public SlowAdapter(Context context) { 
            mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
        } 
 
        /**
         * 列表中元素个数取决于数据的个数
         */ 
        public int getCount() { 
            return mStrings.length; 
        } 
 
        /**
         * 我们的模拟数据是从数组中获取的,因此这里直接返回索引值就可以获取相应的数据了
         */ 
        public Object getItem(int position) { 
            return position; 
        } 
 
        /**
         * 使用数组的索引作为唯一的id
         */ 
        public long getItemId(int position) { 
            return position; 
        } 
 
        /**
         * 获取List中每一行的view
         */ 
        public View getView(int position, View convertView, ViewGroup parent) { 
            TextView text; 
             
            //给text赋值 
            if (null == convertView) { 
                text = (TextView) mInflater.inflate(android.R.layout.易做图_list_item_1, parent, false); 
            } else { 
                text = (TextView) convertView; 
            } 
             
            if (!mBusy) { 
                //当前不处于加载数据的忙碌时期(没有滚屏),则显示数据 
                text.setText(mStrings[position]); 
                //这里约定将tag设置为null说明这个view已经有了正确的数据 
                text.setTag(null); 
            } else { 
                //当前处于滚屏阶段,不加载数据,直接显示数据加载中提示 
                text.setText("Loading..."); 
                //tag非空说明这个view仍然需要进行数据加载并显示 
                text.setTag(this); 
            } 
             
            return text; 
        } 
         
    } 
     
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
         
        mStatus = (TextView) findViewById(R.id.status); 
        mStatus.setText("Idle"); 
         
        //使用自定义的ListAdapter将数据映射到TextView中 
        setListAdapter(new SlowAdapter(this)); 
         
        //设置滚动易做图 
        getListView().setOnScrollListener(this); 
    } 
 
    public void onScroll(AbsListView view, int firstVisibleItem, 
            int visibleItemCount, int totalItemCount) { 
         
    } 
 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
        switch (scrollState) { 
        case OnScrollListener.SCROLL_ST
补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,