listview刷新单个item item中有多个item

点击listview时得到item中的数据的方式 - 简书
下载简书移动应用
写了15820字,被29人关注,获得了78个喜欢
点击listview时得到item中的数据的方式
我将数据库的数据显示在listview上时,想通过长按listview显示菜单,菜单中包含删除和更新操作,通过长按listview显示菜单,可以通过复写onCreateContextMenu()和onContextItemSelected()方法来实现,这个很简单,在这里就不赘述了,重点在于当我们进行删除操作时,如何删除这一项,也就是我们需要得到这个item中的数据,比如id,这个id是数据库的id,而不是item的id,这两个是不相同的,因为当我们删除其中的某一个item时,item的id和数据库的id就会不同。那么我们如何得到数据库的id呢?这里提供五种种方法:方法一:让listview设置监听器,这里需要提一下,我们最好是设置长按监听器,不然的话,你点击一下,得到了id,然后还要再长按一次,得到菜单,因为长按只会触发OnItemLongClickListener,不会触发OnItemClickListener,当然你可以让OnItemLongClickListener返回的是false,这样就不会拦截事件了,但是只需要设置一个监听器岂不是更好,所以最好设置长按监听器。然后在其中写入如下代码:
View v=myListView.getChildAt(position);
TextView t=(TextView) v.findViewById(R.id.myTextView1);
itemid=t.getText().toString();其中的第一行是得到listview中的item的布局,我这里是自定义的布局,用的是linearLayout,这里得到的也就是lineadlayout,第二行是得到用于显示id的控件,我这里是用的TextView,它的id就是R.id.myTextView1,如果你使用的是系统的布局,那么你的对应的id就是android.R.i
d.text1,然后第三行就不用解释了,这样就得到了数据库中的id,当然你还可以得到别的很多数据。方法二:让listview设置监听器,然后用到游标,在监听器中加入如下代码:
String sql="select userid from user";
cursor=sqLiteDatabase.rawQuery(sql, null);
cursor.moveToPosition(position);
int id2=cursor.getInt(cursor.getColumnIndex("userid"));这样就得到了这些你所点击的item中的数据库id。方法三:让listview设置监听器,然后写入如下代码:
HashMap&String, String& h1= (HashMap&String, String&) parent.getItemAtPosition(position);
h1.get("userid");这个方法第一行代码得到的是每一个item的值,注意是item的值,这里的item是HashMap结构的。这与第一中方法不同,第一种方法的第一行代码是得到item的布局第二行代码是取值,因为是HashMap结构的,所以采用这个方式取值,其中"userid"是键。方法四:不设置监听器,在onContextItemSelected()方法中写入代码:
AdapterView.AdapterContextMenuInfo info=(AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
int q=(int) info.
Log.i("Logcat", "q="+q);
View v1= myListView.getChildAt(q);
TextView t2=(TextView) v1.findViewById(R.id.myTextView1);
String st=t2.getText().toString();这样的到的st就是你的item的id了。方法五:不设置监听器,在onContextItemSelected()方法中写入代码:
AdapterView.AdapterContextMenuInfo info=(AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
String sql="select userid from user";
cursor=sqLiteDatabase.rawQuery(sql, null);
cursor.moveToPosition((int) info.id);
int id2=cursor.getInt(cursor.getColumnIndex("_id"));
这样就得到了这些你所点击的item中的数据库id。看上述的代码,就会发现这个和方法二类似,方法二的position`就是这里的(int) info.id,这个方法比方法二更简单,因为不用设置监听器。这个方法最简单。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
分享Android开发的知识,教程,解析,前沿信息,都可以,欢迎大家投稿~
内容可搞笑,可逗比,另外欢迎申请管理员
· 21755人关注
Android开发系列文章,与大家一起交流,欢迎投稿。
· 4402人关注
Android深入理解、基础详解及各种Library使用介绍。认真做技术,好好享受人生。。
· 4000人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式: 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
ListView中getView的原理 如何在ListView中放置多个item
下载积分:30
内容提示:android中listView原理
文档格式:PDF|
浏览次数:106|
上传日期: 03:03:33|
文档星级:
该用户还上传了这些文档
ListView中getView的原理 如何在ListView中放置多个item
官方公共微信下次自动登录
现在的位置:
& 综合 & 正文
[Android] ListView中getView的原理+如何在ListView中放置多个item
ListView 和 Adapter 的基础
ListView 针对List中每个item,要求 adapter “给我一个视图” (getView)。
一个新的视图被返回并显示
如果我们有上亿个项目要显示怎么办?为每个项目创建一个新视图?NO!这不可能!
实际上Android为你缓存了视图。
Android中有个叫做Recycler的构件,下图是他的工作原理:
如果你有10亿个项目(item),其中只有可见的项目存在内存中,其他的在Recycler中。
ListView先请求一个type1视图(getView)然后请求其他可见的项目。convertView在getView中是空(null)的。
当item1滚出屏幕,并且一个新的项目从屏幕低端上来时,ListView再请求一个type1视图。convertView此时不是空值了,它的值是item1。你只需设定新的数据然后返回convertView,不必重新创建一个视图。
请看下面的示例,这里在getView中使用了System.out进行输出
class MultipleItemsList extends
ListActivity {
MyCustomAdapter mA
void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAdapter =
new MyCustomAdapter();
i = 0; i &
50; i++) {
mAdapter.addItem("item "
setListAdapter(mAdapter);
class MyCustomAdapter
extends BaseAdapter {
ArrayList mData = new
ArrayList();
LayoutInflater mI
MyCustomAdapter() {
mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
void addItem(final
String item) {
mData.add(item);
notifyDataSetChanged();
int getCount() {
mData.size();
String getItem(int
position) {
mData.get(position);
long getItemId(int
position) {
View getView(int
position, View convertView, ViewGroup parent) {
System.out.println("getView "
+ position + " "
+ convertView);
ViewHolder holder =
(convertView == null) {
convertView = mInflater.inflate(R.layout.item1,
new ViewHolder();
holder.textView = (TextView)convertView.findViewById(R.id.text);
convertView.setTag(holder);
holder = (ViewHolder)convertView.getTag();
holder.textView.setText(mData.get(position));
static class
ViewHolder {
TextView textV
执行,然后在Logcat中查看日志
getView 被调用 9 次 ,convertView 对于所有的可见项目是空值(如下)
13:47:32.559: INFO/System.out(947):
getView 0 null
13:47:32.570: INFO/System.out(947):
getView 1 null
13:47:32.589: INFO/System.out(947):
getView 2 null
13:47:32.599: INFO/System.out(947):
getView 3 null
13:47:32.619: INFO/System.out(947):
getView 4 null
13:47:32.629: INFO/System.out(947):
getView 5 null
13:47:32.708: INFO/System.out(947):
getView 6 null
13:47:32.719: INFO/System.out(947):
getView 7 null
13:47:32.729: INFO/System.out(947):
getView 8 null
然后稍微向下滚动List,直到item10出现:
convertView仍然是空值,因为recycler中没有视图(item1的边缘仍然可见,在顶端)
13:48:25.169: INFO/System.out(947):
getView 9 null
再滚动List
convertView不是空值了!item1离开屏幕到Recycler中去了,然后item11被创建
13:48:42.879: INFO/System.out(947):
getView 10 android.widget.LinearLayout@
14:01:31.069: INFO/System.out(947):
getView 11 android.widget.LinearLayout@
14:01:31.142: INFO/System.out(947):
getView 12 android.widget.LinearLayout@43744ff8
14:01:31.279: INFO/System.out(947):
getView 13 android.widget.LinearLayout@43743fa8
14:01:31.350: INFO/System.out(947):
getView 14 android.widget.LinearLayout@
14:01:31.429: INFO/System.out(947):
getView 15 android.widget.LinearLayout@
14:01:31.550: INFO/System.out(947):
getView 16 android.widget.LinearLayout@
14:01:31.669: INFO/System.out(947):
getView 17 android.widget.LinearLayout@
14:01:31.839: INFO/System.out(947):
getView 18 android.widget.LinearLayout@
14:03:30.900: INFO/System.out(947):
getView 19 android.widget.LinearLayout@43748df0
14:03:32.069: INFO/System.out(947):
getView 20 android.widget.LinearLayout@
convertView 如我们所期待的非空了,在item11离开屏幕之后,它的视图(@)作为convertView容纳item21了
不同的项目布局(item layout)
我们再举一个稍微复杂的例子,在上例的list中加入一些分隔线
你需要做这些:
重(@Override)写 getViewTypeCount() – 返回你有多少个不同的布局
重写 getItemViewType(int) – 由position返回view type id
根据view item的类型,在getView中创建正确的convertView
以下是代码:
class MultipleItemsList extends
ListActivity {
MyCustomAdapter mA
void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAdapter =
new MyCustomAdapter();
i = 1; i &
50; i++) {
mAdapter.addItem("item "
mAdapter.addSeparatorItem("separator "
setListAdapter(mAdapter);
class MyCustomAdapter
extends BaseAdapter {
static final
int TYPE_ITEM = 0;
static final
int TYPE_SEPARATOR = 1;
static final
int TYPE_MAX_COUNT = TYPE_SEPARATOR + 1;
ArrayList mData = new
ArrayList();
LayoutInflater mI
TreeSet mSeparatorsSet = new
TreeSet();
MyCustomAdapter() {
mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
void addItem(final
String item) {
mData.add(item);
notifyDataSetChanged();
void addSeparatorItem(final
String item) {
mData.add(item);
mSeparatorsSet.add(mData.size() -
notifyDataSetChanged();
int getItemViewType(int
position) {
mSeparatorsSet.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM;
int getViewTypeCount() {
TYPE_MAX_COUNT;
int getCount() {
mData.size();
String getItem(int
position) {
mData.get(position);
long getItemId(int
position) {
View getView(int
position, View convertView, ViewGroup parent) {
ViewHolder holder =
type = getItemViewType(position);
System.out.println("getView "
+ position + " "
+ convertView + " type = "
(convertView == null) {
new ViewHolder();
TYPE_ITEM:
convertView = mInflater.inflate(R.layout.item1,
holder.textView = (TextView)convertView.findViewById(R.id.text);
TYPE_SEPARATOR:
convertView = mInflater.inflate(R.layout.item2,
holder.textView = (TextView)convertView.findViewById(R.id.textSeparator);
convertView.setTag(holder);
holder = (ViewHolder)convertView.getTag();
holder.textView.setText(mData.get(position));
static class
ViewHolder {
TextView textV
运行程序,你会看到每4个item一个分割线
看看日志,无异常,所有的convertView都是空的
15:19:03.080: INFO/System.out(1035):
getView 0 null
15:19:03.112: INFO/System.out(1035):
getView 1 null
15:19:03.130: INFO/System.out(1035):
getView 2 null
15:19:03.141: INFO/System.out(1035):
getView 3 null
15:19:03.160: INFO/System.out(1035):
getView 4 null
15:19:03.170: INFO/System.out(1035):
getView 5 null
15:19:03.180: INFO/System.out(1035):
getView 6 null
15:19:03.190: INFO/System.out(1035):
getView 7 null
15:19:03.210: INFO/System.out(1035):
getView 8 null
15:19:03.210: INFO/System.out(1035):
getView 9 null
滚动list:
15:19:54.160: INFO/System.out(1035):
getView 10 null
15:19:57.440: INFO/System.out(1035):
getView 11 android.widget.LinearLayout@
15:20:01.310: INFO/System.out(1035):
getView 12 android.widget.LinearLayout@43744eb0
15:20:01.880: INFO/System.out(1035):
getView 13 android.widget.LinearLayout@
&&&&推荐文章:
【上篇】【下篇】15:21 提问
Android中屏幕显示listview中的item数量
求大神告知,我如何获取当前屏幕显示出的listview的item数量呢?每个屏幕大小不一,能显示出的数量也是不一样的,有没有方法能够计算的??
按赞数排序
刚才那个方法太笨,还可以调用ListView的setOnScrollListener方法,里头复写了一个onScroll方法,方法中的第二个参数就是当前ListView中可见的item数量。下例子中是visibleItemCount:
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
public void onScrollStateChanged(AbsListView view, int scrollState) {
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
ListView.getLastVisiblePosition()-ListView.getFirstVisiblePosition()+1
获取当前屏幕高度/每项item的高度
。item的高度是你自己设计的,你肯定知道。当前屏幕高度你可以百度一下。屏幕高度给你百度了篇文章,自己看看吧
19084关注|1641收录
其他相似问题Android 获取listview中Item的可视百分比
需求: 做新闻埋点上报的时候有种上报叫展现上报。服务端要求当新闻展现超过50%后才算展现,手指做了抛的动作(手指离开屏幕前,用力滑了一下)这种在listview中显示的不算展现。猛的一看,实现太难了,后来发现函数public final boolean getLocalVisibleRect(Rect r)获取View的可视区域,比如listView 最顶层的ItemView显示一半,通过函数的到Rect(0, 60 - )0 和 1080 是itemView的left right60 和 120 是itemView的top bottom如果显示全 itemView的top就是0。如果是最低层的itemView显示一点,通过函数得到的Rect(0, 0 - 1080, 21)top为0,说明上面没有覆盖,bottom为21,说明下面覆盖了(120-21)个点所以计算显示百分比的函数
public int getVisibilityPercents(View view){
tv.getLocalVisibleRect(rect);
int height = tv.getHeight();
percents = 100;
if(rect.top==0 && rect.bottom == height){
percents = 100;
}else if(rect.top & 0){
percents =
(height - rect.top) * 100 /
}else if(rect.bottom & 0 && rect.bottom &height) {
percents =rect.bottom * 100 /
}listview的滑动事件有三个SCROLL_STATE_IDLE = 0; & & & & & & & & & & & 停止滚动SCROLL_STATE_TOUCH_SCROLL = 1; 正在滚动SCROLL_STATE_FLING = 2; & & 惯性滑动惯性滑动的时候展现的新闻不算展现,也就是说,在SCROLL_STATE_IDLE的时候计算整个屏幕的itemView的展现百分比,在SCROLL_STATE_TOUCH_SCROLL的时候,只计算最下面itemView的百分比就好。关键代码:public class DataListItem extends Object{
public String mT
public Rect rect = new Rect();
public DataListItem(String title){
public int getVisibilityPercents(View view){
tv.getLocalVisibleRect(rect);
int height = tv.getHeight();
percents = 100;
if(rect.top==0 && rect.bottom == height){
percents = 100;
}else if(rect.top & 0){
percents =
(height - rect.top) * 100 /
}else if(rect.bottom & 0 && rect.bottom &height) {
percents =rect.bottom * 100 /
for (int i = 0; i & 50; i++) {
mArrayList.add(new DataListItem(&& + i));
mMyAdapter = new MyAdapter(getBaseContext().getApplicationContext(), mArrayList);
mListView.setAdapter(mMyAdapter);
mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
public void onScrollStateChanged(AbsListView view, int scrollState) {
//正在滚动时回调,回调2-3次,手指没抛则回调2次。scrollState = 2的这次不回调
//回调顺序如下
//第1次:scrollState = SCROLL_STATE_TOUCH_SCROLL(1) 正在滚动
//第2次:scrollState = SCROLL_STATE_FLING(2) 手指做了抛的动作(手指离开屏幕前,用力滑了一下)
//第3次:scrollState = SCROLL_STATE_IDLE(0) 停止滚动
//当屏幕停止滚动时为0;当屏幕滚动且用户使用的触碰或手指还在屏幕上时为1;
//由于用户的操作,屏幕产生惯性滑动时为2
mScrollState = scrollS
Log.d(&onScrollStateChanged&,&scrollState = & +scrollState );
Log.d(&onScrollStateChanged&, &view.getFirstVisiblePosition() = & +view.getFirstVisiblePosition() +&view.getLastVisiblePosition() = &+view.getLastVisiblePosition() );
if(mScrollState == 0){
for (int i = view.getFirstVisiblePosition(),j=0;i&=view.getLastVisiblePosition();i++,j++){
View v = view.getChildAt(j);
if(v==null)
DataListItem d =
mArrayList.get(i);
int percents = d.getVisibilityPercents(v);
Log.d(TAG ,d.mTitle +&
&+percents+&%&);
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//滚动时一直回调,直到停止滚动时才停止回调。单击时回调一次。
//firstVisibleItem:当前能看见的第一个列表项ID(从0开始)
//visibleItemCount:当前能看见的列表项个数(小半个也算)
//totalItemCount:列表项共数
Log.d(&onScroll&, &firstVisibleItem = & + firstVisibleItem + & visibleItemCount = & + visibleItemCount + & totalItemCount = & + totalItemCount);
if(mScrollState == 0){
for (int i = firstVisibleItem ,j=0;i&visibleItemCi++,j++){
View v = view.getChildAt(j);
DataListItem d =
mArrayList.get(i);
int percents = d.getVisibilityPercents(v);
Log.d(TAG ,d.mTitle +&
&+percents+&%&);
}else if(mScrollState == 1){
DataListItem d =
mArrayList.get(firstVisibleItem);
View v = view.getChildAt(0);
int percents = d.getVisibilityPercents(v);
Log.d(TAG ,d.mTitle +&
&+percents+&%&);
mArrayList.get(firstVisibleItem +visibleItemCount-1);
v = view.getChildAt(visibleItemCount-1);
percents = d.getVisibilityPercents(v);
Log.d(TAG ,d.mTitle +&
&+percents+&%&);
最新教程周点击榜
微信扫一扫}

我要回帖

更多关于 listview刷新单个item 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信