ListView添加Adapter的不同的方式

本文介绍了一种在Android应用中优化ListView性能的方法,通过采用分批加载数据的方式,随着用户的滚动动态更新列表内容,提高了用户体验。文章详细展示了如何实现ListView的动态加载,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    public class Connection_adapter extends BaseAdapter {  
        //对话窗口适配器  
        private Context context;  
        private LayoutInflater inflater;  
        private List<Map<String, Object>> list;  


                 //假的数据进行填充  
            public void getData() {  
        list = new ArrayList<Map<String, Object>>();  
        Map<String, Object> map1 = new HashMap<String, Object>();  
        map1.put("IV_head", R.drawable.head);  
        map1.put("NatName", "沙皮狗的忧伤");  
        map1.put("TVContent", "你好啊");  
        map1.put("Time", "19:11:04");  
        list.add(map1);  
      
        Map<String, Object> map2 = new HashMap<String, Object>();  
        map2.put("IV_head", R.drawable.head);  
        map2.put("NatName", "沙皮狗的悲伤");  
        map2.put("TVContent", "我不好");  
        map2.put("Time", "19:11:04");  
        list.add(map2);  
    }  
      
    public Connection_adapter(Context context, List<Map<String, Object>> list) {  
        getData();  
        this.context = context;  
        inflater = LayoutInflater.from(context);  
        // this.list = list;  
    }  
      
    @Override  
    public int getCount() {  
        // TODO Auto-generated method stub  
        return list.size();  
    }  
      
    @Override  
    public Object getItem(int arg0) {  
        // TODO Auto-generated method stub  
        return list.get(arg0);  
    }  
      
    @Override  
    public long getItemId(int arg0) {  
        // TODO Auto-generated method stub  
        return arg0;  
    }  
      
    @Override  
    public View getView(int position, View convertView, ViewGroup arg2) {  
        // TODO Auto-generated method stub  
        final int selectId = position;  
        ViewHolder holder;  
        View view;  


    //判断是ListView界面里是否已经创建View视图,优化ListView,防止重复创建           


        if (convertView == null) {  
            view = inflater.inflate(R.layout.activity_connection, null);  
            holder = new ViewHolder();  
            holder.IV_head = (ImageView) view.findViewById(R.id.IV_head);  
            holder.NatName = (TextView) view.findViewById(R.id.NatName);  
            holder.TVContent = (TextView) view.findViewById(R.id.TVContent);  
            holder.Time = (TextView) view.findViewById(R.id.Time);  
            view.setTag(holder);  
        } else {  
            view = convertView;  
            holder = (ViewHolder) view.getTag();  
        }  
      
        //list.get(position);  
        //System.out.println("查看List中是否有数据::list.get(position)" + position);  
      
        holder.NatName.setText((String) list.get(position).get("NatName"));  
        holder.TVContent.setText((String) list.get(position).get("TVContent"));  
        holder.Time.setText((String) list.get(position).get("Time"));  
        holder.IV_head.setImageResource((Integer) list.get(position).get(  
                "IV_head"));  
      
        return view;  
    }  
      
    class ViewHolder {  
        ImageView IV_head;  
        TextView NatName, TVContent, Time;  
      
    }  








1. 引言:

 

为了提高ListView的效率和应用程序的性能,在Android应用程序中不应该一次性加载ListView所要显示的全部信息,而是采取分批加载策略,随着用户的滑动,动态的从后台加载所需的数据,并渲染到ListView组件中,这样可以极大的改善应用程序的性能和用户体验。

2. 交互:

 

进入ListView组件,首先预加载N条记录,当用户滑动到最后一条记录显示加载提示信息,并从后台加载N条数据,接着渲染UI界面。

3. 效果图:

ListView动态加载数据

4. 程序实现:
[Java] view plain copy

    package com.focus.loading;  
    import android.app.ListActivity;  
    import android.os.Bundle;  
    import android.os.Handler;  
    import android.view.Gravity;  
    import android.view.View;  
    import android.view.ViewGroup;  
    import android.widget.AbsListView;  
    import android.widget.BaseAdapter;  
    import android.widget.LinearLayout;  
    import android.widget.ListView;  
    import android.widget.ProgressBar;  
    import android.widget.TextView;  
    import android.widget.AbsListView.OnScrollListener;  
    import android.widget.LinearLayout.LayoutParams;  
    public class ListViewLoadingActivity extends ListActivity implements  
            OnScrollListener {  
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            /**
             * "加载项"布局,此布局被添加到ListView的Footer中。
             */  
            mLoadLayout = new LinearLayout(this);  
            mLoadLayout.setMinimumHeight(60);  
            mLoadLayout.setGravity(Gravity.CENTER);  
            mLoadLayout.setOrientation(LinearLayout.HORIZONTAL);  
            /**
             * 向"加载项"布局中添加一个圆型进度条。
             */  
            ProgressBar mProgressBar = new ProgressBar(this);  
            mProgressBar.setPadding(0, 0, 15, 0);  
            mLoadLayout.addView(mProgressBar, mProgressBarLayoutParams);  
            /**
             * 向"加载项"布局中添加提示信息。
             */  
            TextView mTipContent = new TextView(this);  
            mTipContent.setText("加载中...");  
            mLoadLayout.addView(mTipContent, mTipContentLayoutParams);  
            /**
             * 获取ListView组件,并将"加载项"布局添加到ListView组件的Footer中。
             */  
            mListView = getListView();  
            mListView.addFooterView(mLoadLayout);  
            /**
             * 组ListView组件设置Adapter,并设置滑动监听事件。
             */  
            setListAdapter(mListViewAdapter);  
            mListView.setOnScrollListener(this);  
        }  
        public void onScroll(AbsListView view, int mFirstVisibleItem,  
                int mVisibleItemCount, int mTotalItemCount) {  
            mLastItem = mFirstVisibleItem + mVisibleItemCount - 1;  
            if (mListViewAdapter.count > mCount) {  
                mListView.removeFooterView(mLoadLayout);  
            }  
        }  
        public void onScrollStateChanged(AbsListView view, int mScrollState) {  
              
            /**
             * 当ListView滑动到最后一条记录时这时,我们会看到已经被添加到ListView的"加载项"布局, 这时应该加载剩余数据。
             */  
            if (mLastItem == mListViewAdapter.count  
                    && mScrollState == OnScrollListener.SCROLL_STATE_IDLE) {  
                if (mListViewAdapter.count <= mCount) {  
                    mHandler.postDelayed(new Runnable() {  
                        @Override  
                        public void run() {  
                            mListViewAdapter.count += 10;  
                            mListViewAdapter.notifyDataSetChanged();  
                            mListView.setSelection(mLastItem);  
                        }  
                    }, 1000);  
                }  
            }  
        }  
        class ListViewAdapter extends BaseAdapter {  
            int count = 10;  
            public int getCount() {  
                return count;  
            }  
            public Object getItem(int position) {  
                return position;  
            }  
            public long getItemId(int position) {  
                return position;  
            }  
            public View getView(int position, View view, ViewGroup parent) {  
                TextView mTextView;  
                if (view == null) {  
                    mTextView = new TextView(ListViewLoadingActivity.this);  
                } else {  
                    mTextView = (TextView) view;  
                }  
                mTextView.setText("Item " + position);  
                mTextView.setTextSize(20f);  
                mTextView.setGravity(Gravity.CENTER);  
                mTextView.setHeight(60);  
                return mTextView;  
            }  
        }  
        private LinearLayout mLoadLayout;  
        private ListView mListView;  
        private ListViewAdapter mListViewAdapter = new ListViewAdapter();  
        private int mLastItem = 0;  
        private int mCount = 41;  
        private final Handler mHandler = new Handler();  
        private final LayoutParams mProgressBarLayoutParams = new LinearLayout.LayoutParams(  
                LinearLayout.LayoutParams.WRAP_CONTENT,  
                LinearLayout.LayoutParams.WRAP_CONTENT);  
        private final LayoutParams mTipContentLayoutParams = new LinearLayout.LayoutParams(  
                LinearLayout.LayoutParams.WRAP_CONTENT,  
                LinearLayout.LayoutParams.WRAP_CONTENT);  
    }  




 1、线程的销毁

Hanlder是线程与Activity通信的桥梁,利用handler接收到任务线程,放到任务队列里面派对执行。


//调用该任务线程的run() 方法执行任务线程。

Handler updateBarHandler =new handler();
handler.post(Runnable Thread);

//移除handler里的任务线程,调用线程的stop()方法,销毁线程。
handler.removecallbacks(Runnable Thread);

一个简单的例子如下:
import Android.app.Activity;  
import Android.os.Bundle;  
import Android.os.Handler;  
import Android.util.Log;  
public class HandlerThread extends Activity {  
    private static final String TAG = "HandlerThread";  
    private Handler mHandler =  new Handler();  
      
    private Runnable mRunnable = new Runnable() {  
          
        public void run() {  
            //为了方便 查看,我们用Log打印出来  
            Log.e(TAG, Thread.currentThread().getName() + "Thread run");          
        }  
          
    };  
    @Override
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);   
        //通过Handler启动线程  
        mHandler.post(mRunnable);  
    }  
      
    @Override
    protected void onDestroy() {  
        //将线程销毁掉  
        mHandler.removeCallbacks(mRunnable);  
        super.onDestroy();  
    }  
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值