android的listview,android: listview in listview

这个博客介绍了一个自定义的NestedListView组件,该组件在内部限制了最多可见列表项的数量,当超过设定的最大数量时,会在用户触摸移动时自动滚动。通过实现OnTouchListener和OnScrollListener接口,控制列表视图的滚动行为,优化了性能和用户体验。

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

@Try this nested class

this works for scroll listView inside listView Or 2 listviews in same activity

android:id="@+id/listviewTasks"

android:layout_width="0dip"

android:layout_height="wrap_content"

android:layout_marginBottom="2dp"

android:layout_weight="1"

android:cacheColorHint="#00000000" >

NestedListView :

import android.content.Context;

import android.util.AttributeSet;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnTouchListener;

import android.view.ViewGroup;

import android.widget.AbsListView;

import android.widget.AbsListView.OnScrollListener;

import android.widget.ListAdapter;

import android.widget.ListView;

public class NestedListView extends ListView implements OnTouchListener, OnScrollListener {

private int listViewTouchAction;

private static final int MAXIMUM_LIST_ITEMS_VIEWABLE = 99;

public NestedListView(Context context, AttributeSet attrs) {

super(context, attrs);

listViewTouchAction = -1;

setOnScrollListener(this);

setOnTouchListener(this);

}

@Override

public void onScroll(AbsListView view, int firstVisibleItem,

int visibleItemCount, int totalItemCount) {

if (getAdapter() != null && getAdapter().getCount() > MAXIMUM_LIST_ITEMS_VIEWABLE) {

if (listViewTouchAction == MotionEvent.ACTION_MOVE) {

scrollBy(0, -1);

}

}

}

@Override

public void onScrollStateChanged(AbsListView view, int scrollState) {

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

int newHeight = 0;

final int heightMode = MeasureSpec.getMode(heightMeasureSpec);

int heightSize = MeasureSpec.getSize(heightMeasureSpec);

if (heightMode != MeasureSpec.EXACTLY) {

ListAdapter listAdapter = getAdapter();

if (listAdapter != null && !listAdapter.isEmpty()) {

int listPosition = 0;

for (listPosition = 0; listPosition < listAdapter.getCount()

&& listPosition < MAXIMUM_LIST_ITEMS_VIEWABLE; listPosition++) {

View listItem = listAdapter.getView(listPosition, null, this);

//now it will not throw a NPE if listItem is a ViewGroup instance

if (listItem instanceof ViewGroup) {

listItem.setLayoutParams(new LayoutParams(

LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

}

listItem.measure(widthMeasureSpec, heightMeasureSpec);

newHeight += listItem.getMeasuredHeight();

}

newHeight += getDividerHeight() * listPosition;

}

if ((heightMode == MeasureSpec.AT_MOST) && (newHeight > heightSize)) {

if (newHeight > heightSize) {

newHeight = heightSize;

}

}

} else {

newHeight = getMeasuredHeight();

}

setMeasuredDimension(getMeasuredWidth(), newHeight);

}

@Override

public boolean onTouch(View v, MotionEvent event) {

if (getAdapter() != null && getAdapter().getCount() > MAXIMUM_LIST_ITEMS_VIEWABLE) {

if (listViewTouchAction == MotionEvent.ACTION_MOVE) {

scrollBy(0, 1);

}

}

return false;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值