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();
}
}
ListView添加Adapter的不同的方式
最新推荐文章于 2019-09-18 11:09:19 发布