Функция прокрутки списка в виде прокрутки

В моем приложении в представлении прокрутки я использую представление списка. Но просмотр списка не прокручивается. Может кто подскажет мне, что мне делать. Я искал его и выяснял, что просмотр списка не прокручивается в режиме прокрутки .
Любое решение?

Вы можете создать собственное представление списка и установить для него значение false. Вот пример класса

public class ExpandableHeightListView extends ListView { boolean expanded = false; public ExpandableHeightListView(Context context) { super(context); } public ExpandableHeightListView(Context context, AttributeSet attrs) { super(context, attrs); } public ExpandableHeightListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public boolean isExpanded() { return expanded; } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // HACK! TAKE THAT ANDROID! if (isExpanded()) { int expandSpec = MeasureSpec.makeMeasureSpec( Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); ViewGroup.LayoutParams params = getLayoutParams(); params.height = getMeasuredHeight(); } else { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } public void setExpanded(boolean expanded) { this.expanded = expanded; } } 

Вы можете использовать, как это, ваш activity.clas

  ExpandableHeightListView listview = (ExpandableHeightListView) findViewById(R.id.list); listview.setExpanded(true); 

В вашем файле макета вы можете использовать ExpandableHeightListView в месте просмотра списка в прокрутке. Он будет прокручиваться.

Исключить ListView из ScrollView, потому что ListView уже имеет в нем механизм прокрутки.

ListView Inside Scroll View не будет работать. Положите это на сторону. Потому что у обоих есть функция прокрутки, поэтому прокрутка не будет работать, когда тай будет собраться вместе.

Не помещайте listview внутри прокрутки.

ListView уже обрабатывает прокрутку, поэтому не нужно находиться внутри scrollview.

Вы должны изменить свои макеты, чтобы отразить это.

Используйте этот класс.

 public class CustomScrollView extends ScrollView { public CustomScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public boolean onTouchEvent(MotionEvent ev) { return true; } public boolean onInterceptTouchEvent(MotionEvent ev) { return false; } } 

И в вашем макете xml измените свой тег scrollview с именем пакета и классом CustomScrollView. Т.е. изменить на com.test.CustomScrollView .

И внутри вас Activity получите идентификатор пользовательского прокрутки и включите этот код.

 private int currentX, currentY; private CustomScrollView customScrollView; customScrollView.setSmoothScrollingEnabled(true); customScrollView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub switch(event.getAction()){ case MotionEvent.ACTION_DOWN: { currentX = (int) event.getRawX(); currentY = (int) event.getRawY(); break; } case MotionEvent.ACTION_MOVE: { @SuppressWarnings("unused") int x2 = (int) event.getRawX(); int y2 = (int) event.getRawY(); customScrollView.scrollBy(0 , currentY - y2); currentY = y2; break; } case MotionEvent.ACTION_UP: { break; } } return true; } }); 

Не помещайте listView внутри ScrollView. Вы должны прочитать ответ Ромен Гай и комментарий выше:

Как я могу поместить ListView в ScrollView без его свертывания?

Вы можете исключить ListView из представления прокрутки. Если вы хотите иметь «список» внутри scrollView, вы можете использовать LinearLayout. Что-то вроде этого:

 public class MyListLayout extends LinearLayout implements View.OnClickListener { private Adapter list; private View.OnClickListener mListener; public MyListLayout(Context context) { super(context); } public MyListLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public EvernoteListLayout(Context context, AttributeSet attrs) { super(context, attrs); } @Override public void onClick(View v) { if (mListener!=null) mListener.onClick(v); } public void setList(Adapter list) { this.list = list; //Popolute list if (this.list!=null){ for (int i=0;i<this.list.getCount();i++){ View item= list.getView(i, null,null); this.addView(item); } } } public void setmListener(View.OnClickListener mListener) { this.mListener = mListener; } } // Create ArrayAdapter MyListAdapter mListAdapter = new MyListAdapter(); MyListLayout mLay = (MyListLayout) findViewById(R.id.box_list_ev); if (mLay != null) { mLay.setList(mListAdapter); } 

Я предполагаю, что у вас есть особый случай, как я это делал, когда мне приходилось это делать. У меня есть вспомогательный класс, который выглядит так:

  public class ScrollViewListHelper { public static void getListViewSize(ListView myListView) { ListAdapter myListAdapter = myListView.getAdapter(); if (myListAdapter == null) { //do nothing return null return; } //set listAdapter in loop for getting final size int totalHeight = 0; for (int size = 0; size < myListAdapter.getCount(); size++) { View listItem = myListAdapter.getView(size, null, myListView); listItem.measure(0, 0); totalHeight += listItem.getMeasuredHeight(); } //setting listview item in adapter ViewGroup.LayoutParams params = myListView.getLayoutParams(); params.height = totalHeight + (myListView.getDividerHeight() * (myListAdapter.getCount() - 1)); myListView.setLayoutParams(params); // print height of adapter on log Log.i("height of listItem:", String.valueOf(totalHeight)); } 

}

А затем после того, как я инициализирую адаптер для listView, я делаю это:

  ScrollViewListHelper.getListViewSize(listViewMeasurements); 

Прокрутка «ест» все касания … Нельзя вставлять прокручиваемый элемент (ListView) в другой элемент прокрутки (прокрутка), ваш пользователь может сходить с ума.

В этих случаях я использую LinearLayout вместо ListView, и я вдуваю в него пользовательский вид, созданный для представления каждого элемента List, вот пример, я не стал спрашивать меня больше:

 LinearLayout containerLinearLayout= (LinearLayout)findViewById(R.id.containerLinearLayout); containerLinearLayout.removeAllViews(); for(int i=0;i<array.length();i++){ JSONObject convocazione=array.getJSONObject(i); View child = getLayoutInflater().inflate(R.layout.list_element_layout,null); TextView txtDettaglioLuogo=(TextView)child.findViewById(R.id.txtDettaglioLuogo); TextView txtOra=(TextView)child.findViewById(R.id.txtOra); txtOra.setText("text"); txtData.setText("more text"); containerLinearLayout.addView(child); } 
 import android.content.Context; import android.widget.ListView; public class MyListView extends ListView { public MyListView(Context context) { super(context); } public MyListView(Context context, android.util.AttributeSet attrs) { super(context, attrs); } public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } } 

использовать это

Наконец, я получил решение для прокрутки проблемы, я получил пользовательский класс scrollview для управления scrollview.

 import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.widget.ScrollView; public class VerticalScrollview extends ScrollView{ public VerticalScrollview(Context context) { super(context); } public VerticalScrollview(Context context, AttributeSet attrs) { super(context, attrs); } public VerticalScrollview(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { final int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.i("VerticalScrollview", "onInterceptTouchEvent: DOWN super false" ); super.onTouchEvent(ev); break; case MotionEvent.ACTION_MOVE: return false; // redirect MotionEvents to ourself case MotionEvent.ACTION_CANCEL: Log.i("VerticalScrollview", "onInterceptTouchEvent: CANCEL super false" ); super.onTouchEvent(ev); break; case MotionEvent.ACTION_UP: Log.i("VerticalScrollview", "onInterceptTouchEvent: UP super false" ); return false; default: Log.i("VerticalScrollview", "onInterceptTouchEvent: " + action ); break; } return false; } @Override public boolean onTouchEvent(MotionEvent ev) { super.onTouchEvent(ev); Log.i("VerticalScrollview", "onTouchEvent. action: " + ev.getAction() ); return true; } } 

Проверьте исходный код onMeasure в ListView, вы обнаружите, что если height measureSpec НЕ УСТАНАВЛИВАЕТСЯ, высота списка – это высота только одного элемента плюс некоторое отступы, см. Ниже:

  if (heightMode == MeasureSpec.UNSPECIFIED) { heightSize = mListPadding.top + mListPadding.bottom + childHeight + getVerticalFadingEdgeLength() * 2; } 

Таким образом, мы можем легко изменить высоту SpecMode на AT_MOST, а размер высоты – это размер левой высоты его родителя. Ниже приведено решение:

 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { heightMeasureSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(heightMeasureSpec), MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, heightMeasureSpec); }