Android中ListView数据处理优化
来自:OPEN经验库
原帖:http://www.open-open.com/lib/view/open1330132229874.html
Android 应用开发中,采用ListView组件来展示数据是很常用的功能,当一个应用要展现很多的数据时,一般情况下都不会把所有的数据一次就展示出来,而是通过 分页的形式来展示数据,个人觉得这样会有更好的用户体验。因此,很多应用都是采用分批次加载的形式来获取用户所需的数据。例如:微博客户端可能会在用户滑 动至列表底端时自动加载下一页数据,也可能在底部放置一个"查看更多"按钮,用户点击后,加载下一页数据。
下面通过一个Demo来展示ListView功能如何实现:该Demo通过在ListView列表的底部添加一个“查看更多...”按钮来加载新闻(模拟 新闻客户端)分页数据。同时限定每次加载10条记录,但完全加载完数据后,就把ListView列表底部视图“查看更多...”删除。假设加载的数据总数 为 38 条记录。先看下该Demo工程的程序结构图:
其中包 com.andyidea.bean中News.java类是新闻实体类,包com.andyidea.listview中 paginationListViewActivity.java类是用来展示ListView列表。布局layout中包含三个布局文件,分别 为:list_item.xml , loadmore.xml , main.xml 。下面分别贴下源码:
layout中的 list_item.xml源码:
01
|
< span style = "font-size:13px;" ><? xml version = "1.0" encoding = "utf-8" ?>
|
02
|
< LinearLayout
|
03
|
xmlns:android = "http://schemas.android.com/apk/res/android"
|
04
|
android:layout_width = "fill_parent"
|
05
|
android:layout_height = "fill_parent"
|
06
|
android:orientation = "vertical" >
|
07
|
< TextView
|
08
|
android:id = "@+id/newstitle"
|
09
|
android:layout_width = "fill_parent"
|
10
|
android:layout_height = "wrap_content" />
|
11
|
< TextView
|
12
|
android:id = "@+id/newscontent"
|
13
|
android:layout_width = "fill_parent"
|
14
|
android:layout_height = "wrap_content" />
|
15
|
</ LinearLayout ></ span >
|
layout中loadmore.xml源码:
01
|
<? xml version = "1.0" encoding = "utf-8" ?>
|
02
|
< LinearLayout
|
03
|
xmlns:android = "http://schemas.android.com/apk/res/android"
|
04
|
android:layout_width = "fill_parent"
|
05
|
android:layout_height = "fill_parent" >
|
06
|
< Button
|
07
|
android:id = "@+id/loadMoreButton"
|
08
|
android:layout_width = "fill_parent"
|
09
|
android:layout_height = "wrap_content"
|
10
|
android:text = "查看更多..." />
|
11
|
</ LinearLayout >
|
layout中main.xml源码:
01
|
<? xml version = "1.0" encoding = "utf-8" ?>
|
02
|
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
|
03
|
android:orientation = "vertical"
|
04
|
android:layout_width = "fill_parent"
|
05
|
android:layout_height = "fill_parent" >
|
06
|
< ListView
|
07
|
android:id = "@+id/lvNews"
|
08
|
android:layout_width = "fill_parent"
|
09
|
android:layout_height = "wrap_content" />
|
10
|
</LinearLayou
|
包 com.andyidea.bean中News.java类源码:
01
|
package com.andyidea.bean;
|
02
|
|
03
|
/**
|
04
|
* 新闻实体类
|
05
|
* @author Andy.Chen
|
06
|
* @mail Chenjunjun.ZJ@gmail.com
|
07
|
*
|
08
|
*/
|
09
|
public class News {
|
10
|
|
11
|
private String title; //标题
|
12
|
private String content; //内容
|
13
|
|
14
|
public String getTitle() {
|
15
|
return title;
|
16
|
}
|
17
|
public void setTitle(String title) {
|
18
|
this .title = title;
|
19
|
}
|
20
|
public String getContent() {
|
21
|
return content;
|
22
|
}
|
23
|
public void setContent(String content) {
|
24
|
this .content = content;
|
25
|
}
|
26
|
|
27
|
}
|
包com.andyidea.listview中paginationListViewActivity.java类源码:
001
|
package com.andyidea.listview;
|
002
|
|
003
|
import java.util.ArrayList;
|
004
|
import java.util.List;
|
005
|
|
006
|
import com.andyidea.bean.News;
|
007
|
|
008
|
import android.app.Activity;
|
009
|
import android.os.Bundle;
|
010
|
import android.os.Handler;
|
011
|
import android.util.Log;
|
012
|
import android.view.View;
|
013
|
import android.view.ViewGroup;
|
014
|
import android.widget.AbsListView;
|
015
|
import android.widget.AbsListView.OnScrollListener;
|
016
|
import android.widget.BaseAdapter;
|
017
|
import android.widget.Button;
|
018
|
import android.widget.ListView;
|
019
|
import android.widget.TextView;
|
020
|
import android.widget.Toast;
|
021
|
|
022
|
public class PaginationListViewActivity extends Activity implements OnScrollListener {
|
023
|
|
024
|
private ListView listView;
|
025
|
private int visibleLastIndex = 0 ; //最后的可视项索引
|
026
|
private int visibleItemCount; // 当前窗口可见项总数
|
027
|
private int datasize = 38 ; //模拟数据集的条数
|
028
|
private PaginationAdapter adapter;
|
029
|
private View loadMoreView;
|
030
|
private Button loadMoreButton;
|
031
|
private Handler handler = new Handler();
|
032
|
|
033
|
/** Called when the activity is first created. */
|
034
|
@Override
|
035
|
public void onCreate(Bundle savedInstanceState) {
|
036
|
super .onCreate(savedInstanceState);
|
037
|
setContentView(R.layout.main);
|
038
|
|
039
|
loadMoreView = getLayoutInflater().inflate(R.layout.loadmore, null );
|
040
|
loadMoreButton = (Button)loadMoreView.findViewById(R.id.loadMoreButton);
|
041
|
loadMoreButton.setOnClickListener( new View.OnClickListener() {
|
042
|
|
043
|
@Override
|
044
|
public void onClick(View v) {
|
045
|
loadMoreButton.setText( "正在加载中..." ); //设置按钮文字
|
046
|
handler.postDelayed( new Runnable() {
|
047
|
|
048
|
@Override
|
049
|
public void run() {
|
050
|
loadMoreData();
|
051
|
adapter.notifyDataSetChanged();
|
052
|
loadMoreButton.setText( "查看更多..." ); //恢复按钮文字
|
053
|
}
|
054
|
}, 2000 );
|
055
|
|
056
|
}
|
057
|
});
|
058
|
|
059
|
listView = (ListView)findViewById(R.id.lvNews);
|
060
|
listView.addFooterView(loadMoreView); //设置列表底部视图
|
061
|
initializeAdapter();
|
062
|
listView.setAdapter(adapter);
|
063
|
listView.setOnScrollListener( this );
|
064
|
}
|
065
|
|
066
|
@Override
|
067
|
public void onScrollStateChanged(AbsListView view, int scrollState) {
|
068
|
int itemsLastIndex = adapter.getCount()- 1 ; //数据集最后一项的索引
|
069
|
int lastIndex = itemsLastIndex + 1 ;
|
070
|
if (scrollState == OnScrollListener.SCROLL_STATE_IDLE
|
071
|
&& visibleLastIndex == lastIndex) {
|
072
|
// 如果是自动加载,可以在这里放置异步加载数据的代码
|
073
|
}
|
074
|
}
|
075
|
|
076
|
|
077
|
@Override
|
078
|
public void onScroll(AbsListView view, int firstVisibleItem,
|
079
|
int visibleItemCount, int totalItemCount) {
|
080
|
this .visibleItemCount = visibleItemCount;
|
081
|
visibleLastIndex = firstVisibleItem + visibleItemCount - 1 ;
|
082
|
|
083
|
Log.e( "========================= " , "========================" );
|
084
|
Log.e( "firstVisibleItem = " ,firstVisibleItem+ "" );
|
085
|
Log.e( "visibleItemCount = " ,visibleItemCount+ "" );
|
086
|
Log.e( "totalItemCount = " ,totalItemCount+ "" );
|
087
|
Log.e( "========================= " , "========================" );
|
088
|
|
089
|
//如果所有的记录选项等于数据集的条数,则移除列表底部视图
|
090
|
if (totalItemCount == datasize+ 1 ){
|
091
|
listView.removeFooterView(loadMoreView);
|
092
|
Toast.makeText( this , "数据全部加载完!" , Toast.LENGTH_LONG).show();
|
093
|
}
|
094
|
}
|
095
|
|
096
|
/**
|
097
|
* 初始化ListView的适配器
|
098
|
*/
|
099
|
private void initializeAdapter(){
|
100
|
List<News> news = new ArrayList<News>();
|
101
|
for ( int i= 1 ;i<= 10 ;i++){
|
102
|
News items = new News();
|
103
|
items.setTitle( "Title" +i);
|
104
|
items.setContent( "This is News Content" +i);
|
105
|
news.add(items);
|
106
|
}
|
107
|
adapter = new PaginationAdapter(news);
|
108
|
}
|
109
|
|
110
|
/**
|
111
|
* 加载更多数据
|
112
|
*/
|
113
|
private void loadMoreData(){
|
114
|
int count = adapter.getCount();
|
115
|
|
116
|
if (count+ 10 <= datasize){
|
117
|
for ( int i=count+ 1 ; i<=count+ 10 ; i++){
|
118
|
News item = new News();
|
119
|
item.setTitle( "Title" +i);
|
120
|
item.setContent( "This is News Content" +i);
|
121
|
adapter.addNewsItem(item);
|
122
|
}
|
123
|
} else {
|
124
|
for ( int i=count+ 1 ; i<=datasize; i++){
|
125
|
News item = new News();
|
126
|
item.setTitle( "Title" +i);
|
127
|
item.setContent( "This is News Content" +i);
|
128
|
adapter.addNewsItem(item);
|
129
|
}
|
130
|
}
|
131
|
|
132
|
}
|
133
|
|
134
|
|
135
|
class PaginationAdapter extends BaseAdapter{
|
136
|
|
137
|
List<News> newsItems;
|
138
|
|
139
|
public PaginationAdapter(List<News> newsitems){
|
140
|
this .newsItems = newsitems;
|
141
|
}
|
142
|
|
143
|
@Override
|
144
|
public int getCount() {
|
145
|
return newsItems.size();
|
146
|
}
|
147
|
|
148
|
@Override
|
149
|
public Object getItem( int position) {
|
150
|
return newsItems.get(position);
|
151
|
}
|
152
|
|
153
|
@Override
|
154
|
public long getItemId( int position) {
|
155
|
return position;
|
156
|
}
|
157
|
|
158
|
@Override
|
159
|
public View getView( int position, View view, ViewGroup parent) {
|
160
|
if (view == null ){
|
161
|
view = getLayoutInflater().inflate(R.layout.list_item, null );
|
162
|
}
|
163
|
|
164
|
//新闻标题
|
165
|
TextView tvTitle = (TextView)view.findViewById(R.id.newstitle);
|
166
|
tvTitle.setText(newsItems.get(position).getTitle());
|
167
|
//新闻内容
|
168
|
TextView tvContent = (TextView)view.findViewById(R.id.newscontent);
|
169
|
tvContent.setText(newsItems.get(position).getContent());
|
170
|
|
171
|
return view;
|
172
|
}
|
173
|
|
174
|
/**
|
175
|
* 添加数据列表项
|
176
|
* @param newsitem
|
177
|
*/
|
178
|
public void addNewsItem(News newsitem){
|
179
|
newsItems.add(newsitem);
|
180
|
}
|
181
|
|
182
|
}
|
183
|
|
184
|
}
|
最后,运行程序的结果截图如下:
通过上面的截图,当我们点击"查看更多..."按钮时,就会加载下10条记录,当加载完所有的记录后,ListView的底部视图将会移除。
来自:csdn mayingcai1987
原文:http://blog.csdn.net/mayingcai1987/article/details/6273606
1. 引言:
为了提高ListView的效率和应用程序的性能,在Android应用程序中不应该一次性加载ListView所要显示的全部信息,而是采取分批加载策略,随着用户的滑动,动态的从后台加载所需的数据,并渲染到ListView组件中,这样可以极大的改善应用程序的性能和用户体验。
2. 交互:
进入ListView组件,首先预加载N条记录,当用户滑动到最后一条记录显示加载提示信息,并从后台加载N条数据,接着渲染UI界面。
3. 效果图:
4. 程序实现:
- 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);
- }
来自:51CTO论坛
原文:http://mobile.51cto.com/android-265878.htm
对于做Android应用程序来说,ListView一定用得非常多,经常解析xml文件然后在ListView中显示,往往我们需要让它动态地加载内容,也就是不一次性地加载完成,对于手机来说,这点很重要!笔者之前也是弄的不明白,用的时候直接在网上找代码,复制粘贴,再修改一下就是自己的了,笔者的这个小Demo灵感来自于新浪或者腾讯微博手机客户端,比如第一页加载十条Item,当翻到最后一个Item的时候,会出来一个Button,当点击Button的时候就会继续加载更多的,当然如果不点,就不会加载的,节约用户流量,先看效果图
如果觉得满意的话就继续看下面的代码吧,笔者这里没有用到main.xml文件,全部在java文件中定义的,如果理解了的话自己可以在xml文件里面写布局
- 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.View.OnClickListener;
- import android.view.ViewGroup;
- import android.view.ViewGroup.LayoutParams;
- import android.widget.AbsListView;
- import android.widget.AbsListView.OnScrollListener;
- import android.widget.BaseAdapter;
- import android.widget.Button;
- import android.widget.LinearLayout;
- import android.widget.ListView;
- import android.widget.ProgressBar;
- import android.widget.TextView;
- public class ListViewActivity extends ListActivity implements OnScrollListener {
- private LinearLayout mLoadLayout;
- private LinearLayout mProgressLoadLayout;
- private ListView mListView;
- private ListViewAdapter mListViewAdapter = new ListViewAdapter();
- private int mLastItem = 0;
- private int mCount = 41;
- private final Handler mHandler = new Handler();// 在Handler中加载数据
- private final LayoutParams mLayoutParams = new LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.WRAP_CONTENT,
- LinearLayout.LayoutParams.WRAP_CONTENT);
- int scrollState;// 全局变量,用来记录ScrollView的滚动状态,1表示开始滚动,2表示正在滚动,0表示滚动停止
- int visibleItemCount;// 当前可见页面中的Item总数
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- /**
- * "加载项"布局,此布局被添加到ListView的Footer中。
- */
- mLoadLayout = new LinearLayout(this);
- mLoadLayout.setMinimumHeight(30);
- mLoadLayout.setGravity(Gravity.CENTER);
- mLoadLayout.setOrientation(LinearLayout.VERTICAL);
- /*
- * 当点击按钮的时候显示这个View,此View使用水平方式布局,左边是一个进度条,右边是文本,默认设为不可见
- */
- mProgressLoadLayout = new LinearLayout(this);
- mProgressLoadLayout.setMinimumHeight(30);
- mProgressLoadLayout.setGravity(Gravity.CENTER);
- mProgressLoadLayout.setOrientation(LinearLayout.HORIZONTAL);
- ProgressBar mProgressBar = new ProgressBar(this);
- mProgressBar.setPadding(0, 0, 15, 0);
- mProgressLoadLayout.addView(mProgressBar, mLayoutParams);// 为布局添加进度条
- TextView mTipContent = new TextView(this);
- mTipContent.setText("加载中...");
- mProgressLoadLayout.addView(mTipContent, mLayoutParams);// 为布局添加文本
- mProgressLoadLayout.setVisibility(View.GONE);// 默认设为不可见,注意View.GONE和View.INVISIBLE的区别
- mLoadLayout.addView(mProgressLoadLayout);// 把之前的布局以View对象添加进来
- final Button button = new Button(this);
- button.setText("加载更多");
- // 添加按钮
- mLoadLayout.addView(button, new LayoutParams(LayoutParams.FILL_PARENT,
- LayoutParams.WRAP_CONTENT));
- button.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mLastItem == mListViewAdapter.count
- && scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
- // 当点击时把带进度条的Layout设为可见,把Button设为不可见
- mProgressLoadLayout.setVisibility(View.VISIBLE);
- button.setVisibility(View.GONE);
- if (mListViewAdapter.count <= mCount) {
- mHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- mListViewAdapter.count += 10;
- mListViewAdapter.notifyDataSetChanged();
- mListView.setSelection(mLastItem
- - visibleItemCount + 1);
- // 获取数据成功时把Layout设为不可见,把Button设为可见
- mProgressLoadLayout.setVisibility(View.GONE);
- button.setVisibility(View.VISIBLE);
- }
- }, 2000);
- }
- }
- }
- });
- mListView = getListView();
- mListView.addFooterView(mLoadLayout);
- setListAdapter(mListViewAdapter);
- mListView.setOnScrollListener(this);
- }
- @Override
- public void onScroll(AbsListView view, int firstVisibleItem,
- int visibleItemCount, int totalItemCount) {
- this.visibleItemCount = visibleItemCount;
- mLastItem = firstVisibleItem + visibleItemCount - 1;
- if (mListViewAdapter.count > mCount) {
- mListView.removeFooterView(mLoadLayout);
- }
- }
- @Override
- public void onScrollStateChanged(AbsListView view, int scrollState) {
- this.scrollState = scrollState;
- }
- 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(ListViewActivity.this);
- } else {
- mTextView = (TextView) view;
- }
- mTextView.setText("Item " + position);
- mTextView.setTextSize(20f);
- mTextView.setGravity(Gravity.CENTER);
- mTextView.setHeight(60);
- return mTextView;
- }
- }
- }
【编辑推荐】
Android ListView详解
使用ListView 显示数据
Android开发:自定义GridView/ListView数据源
Android开发:实现带图片和checkbox的listview
Android开发:实现带图片和checkbox的listview
Android中ListView数据处理优化相关推荐
- Android中ListView的优化
ListView的优化方案有很多,主要是以下几点 1. 重用了convertView,减少了内存消耗.通过判断convertView是否为null,是的话就需要产生一个ViewHol ...
- android中Listview的优化技巧
2019独角兽企业重金招聘Python工程师标准>>> 减少内存中view对象的创建个数(明显提高效率) 复用历史缓存的view对象,减少Android内存消耗 减少子孩 ...
- ym——Android之ListView性能优化
转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! Android之ListView性能优化 假设有看过我写过的15k面试题的朋友们一定知 ...
- android中ListView控件onItemClick事件中获取listView传递的数据
http://blog.csdn.net/aben_2005/article/details/6592205 本文转载自:android中ListView控件&&onItemClick ...
- android listview 数据同步,android中ListView数据刷新时的同步方法
本文实例讲述了android中ListView数据刷新时的同步方法.分享给大家供大家参考.具体实现方法如下: public class Main extends BaseActivity { priv ...
- Android中ListView选中事件setOnItemSelectedListener无反应不生效问题
Android中ListView选中事件setOnItemSelectedListener无反应不生效问题 在学习Android中ListView组件时,android模拟器运行app时,发现点击有反 ...
- android listview 分析,Android中ListView用法实例分析
本文实例分析了Android中ListView用法.分享给大家供大家参考,具体如下: 通过在Layout中添加ListView Widget可以达到在页面布局具有列表效果的交互页面.在这里通过举例来说 ...
- android listview高级,Android中Listview点赞功能的实现
最近这段时间一直在看Android,利用Listview去实现点赞功能,下面给大家介绍下基本思路. 基本思路: 进入界面–>获取数据–> 在Listview中显示–> 通过map集合 ...
- Android 使用Listview的优化
Listview是Android中很重要的一个组件,在开发过程中使用到的Listview能站到30%,在新手开发过程中,往往会忽略对Listview的优化,在上一个项目的开发中,确实用到了很多List ...
最新文章
- antd Form.Item 中如何获取到Select的label值
- CXF 调用 .net webservice
- [转]JDK里的设计模式
- python自学网站 知乎-知乎千赞回答 | 为什么自学python看不进去?
- 安装iis,php,mysql总结
- Centos5.5安装使用Xen
- 【SICP练习】79 练习2.51
- 解决StreamReader读取中文出现乱码的问题
- 鸿蒙os编码_如何看待鸿蒙OS代码示例?
- HBase性能优化方法总结
- 检测多边形是否重叠_只要保留定位感知通道,目标检测模型也能剪枝70%参数
- OpenSL ES录音流程(一)
- 18. 树的子结构(C++版本)
- OpenCV_ImageMatching with SURF and SIFT(使用SURF和 SIFT进行图像匹配 对比)
- java web登录代码_Java Web 登录页面的实现代码实例
- 自己制作机器学习训练和测试使用的二进制数据集(C++)
- meltdown linux检测,Spectre ampamp; Meltdown漏洞检测工具
- Spring Boot:项目前端vue环境搭建
- 遇到问题--python--BLOB/TEXT column 'code' used in key specification without a key length
- Similarity Reasoning and Filtration for Image-Text Matching
热门文章
- 边框的复合写法(HTML、CSS)
- 实验4-1-7 特殊a串数列求和 (20 分)
- Open3d之非阻塞可视化
- php字符串替换多余逗号_PHP字符过滤函数去除字符串最后一个逗号(rtrim)_php技巧...
- 转载关于使用Ant打包Flex的一些脚本
- 【计算机本科补全计划】Mysql 学习小计(3)
- Android第三十三期 - Dialog的应用
- Talking Data副总裁高铎:我们如何赋予大数据生命力
- 数字后端基本概念介绍——Routing Blockage
- 机器人 考研 计算机专业,机器人工程考研方向