ScrollView 내에서 스크롤 할 수없는 ListView
다음과 같은 레이아웃을 만들려고합니다.

문제는 ListViews스크롤 할 수 있는 것을 원하지 않는다는 것입니다. 필요한만큼 높이고 전체 화면을 스크롤 할 수있게 만들고 싶습니다. 나는의 높이를 설정 한 경우 ListView에 wrap_content일을하지 않습니다. 작동하게하는 유일한 방법은 특정 높이를 설정하는 것 ListView입니다. 하지만 .
ListView내부에 넣어서는 안된다는 것을 알고ScrollView 있지만 ListView모든 항목을 표시하기 위해 스크롤 할 수 있는 것을 원하지 않습니다 .
작동하는 더 좋은 방법이 있을까요?
스크롤 할 수없는 사용자 지정 ListView를 만듭니다.
public class NonScrollListView extends ListView {
public NonScrollListView(Context context) {
super(context);
}
public NonScrollListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public NonScrollListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec(
Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom);
ViewGroup.LayoutParams params = getLayoutParams();
params.height = getMeasuredHeight();
}
}
레이아웃 리소스 파일에서
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fadingEdgeLength="0dp"
android:fillViewport="true"
android:overScrollMode="never"
android:scrollbars="none" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<!-- com.Example Changed with your Package name -->
<com.Example.NonScrollListView
android:id="@+id/lv_nonscroll_list"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</com.Example.NonScrollListView>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/lv_nonscroll_list" >
<!-- Your another layout in scroll view -->
</RelativeLayout>
</RelativeLayout>
</ScrollView>
자바 파일에서
Create a object of your customListview instead of ListView like :
NonScrollListView non_scroll_list = (NonScrollListView) findViewById(R.id.lv_nonscroll_list);
There is no need to use a listview at all.
If you really think about it, a listview can be replaced with a LinearLayout in your case. The Adapter would be the same, however instead of attaching the adapter with your listview, simply call the getView function of the adapter in a for loop on your data and add the retrieved views to your vertical linearlayout.
However this approach is only recommended if you have a small number of items in your list and your display representation of those items is not memory intensive.
The best way to do this (in 2017) is to use a RecyclerView with a NestedScrollView.
No hacks required and it works out of the box like you want it to.
Well, there is a cool Android guy named Mark Murphy a.k.a. CommonsWare and he built a very useful component named CWAC Merge Adapter that allows you to do what you need. You'll need to add the views dynamically and not from XML; but considering your simple UI, that shouldn't be a problem. I'm using it for these kind of cases when I have no idea on what kind of data I'm supposed to scroll.
If you don't want to use it (for licensing reasons maybe), you can have a single listview there (instead of those 2 consecutive list-views) and override getItemViewsCount, getItemViewType and getView in order to give above layout. If you search android listview different rows on Google you'll find useful info. For example this link, or this one.
However, I would go for merge-adapter.
I have a easy solution if it's possible to calculate your item height/wide ... You just need to create a parent Linearlayout of ListView and then fixed parent Height from Java.
Suppose you need to design this view... Now Parent layout size is defining from java...
final LinearLayout parent=(LinearLayout)findViewById(R.id.parent);
final ListView listview=(ListView)findViewById(R.id.listview);
parent.setLayoutParams(new LinearLayout.LayoutParams(parent.getLayoutParams().width, dpToPx( number_of_item_in_list * per_item_size_in_dp )));
//number_of_item_in_list is list side ~ listArray.size();
//per_item_size_in_dp = calculate item size in dp. Ex: 80dp
public static int dpToPx(int dp)
{
return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
}
that's all :)
Choose the ListView that's you want to be Scrollable, and after that add the method 'setOnTouchListener' to automatically the system insert the scroll inside the ListView
final ListView listview = (ListView) findViewById(R.id.list);
listview.setOnTouchListener(new ListView.OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
int action = event.getAction();
switch (action)
{
case MotionEvent.ACTION_DOWN:
// Disallow ScrollView to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
// Allow ScrollView to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(false);
break;
}
// Handle ListView touch events.
v.onTouchEvent(event);
return true;
}
});
listview.setClickable(true);
I hope that works for you
참고URL : https://stackoverflow.com/questions/18813296/non-scrollable-listview-inside-scrollview
'Program Club' 카테고리의 다른 글
| NSString을 설정된 길이로 자르려면 어떻게해야합니까? (0) | 2020.11.16 |
|---|---|
| Ruby-문자열에서 일부 문자를 선택하는 방법 (0) | 2020.11.16 |
| ASP.NET에 대한 이메일 주소 유효성 검사 (0) | 2020.11.16 |
| SQL Server에 null 값을 어떻게 삽입합니까? (0) | 2020.11.16 |
| TLB 슛 다운이란 무엇입니까? (0) | 2020.11.16 |
