I am trying to create a shared list in a horizontal listview . Horizontal scrolling is OK, but vertical scrolling does not work. I tried to use this solution, but nothing happened. What should I do?
HorizontalListviewDemo.java
package com.devsmart.android.ui; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.os.Bundle; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.LinearLayout.LayoutParams; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.TextView; import com.devsmart.android.ui.HorizontialListView; import com.example.horlistview.R; public class HorizontalListViewDemo extends Activity { private final static String ITEM = "item"; private static int COLUMN_COUNT = 20; private static int ROW_COUNT = 50; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listviewdemo); HorizontialListView listview = (HorizontialListView) findViewById(R.id.listview); listview.setAdapter(mAdapter); } static class VerticalViewHolder { protected TextView textview; } public void setColumnCount(int n) { COLUMN_COUNT = n; } public void setRowCount(int n) { ROW_COUNT = n; } private BaseAdapter mAdapter = new BaseAdapter() { public int getCount() { return COLUMN_COUNT; } public Object getItem(int position) { return null; } public long getItemId(int position) { return 0; } public View getView(int position, View convertView, ViewGroup parent) { final List<Map<String, String>> l = createList(); convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.viewitem, null); final ListView listview = (ListView) convertView.findViewById(R.id.viewitem_listview); if (position==0) { listview.setLayoutParams(new LayoutParams(parent.getWidth()-50, LayoutParams.WRAP_CONTENT)); listview.setAdapter(new SimpleAdapter( getApplicationContext(), l, R.layout.viewitemitem, new String[] {ITEM}, new int[] {R.id.textView}) { @Override public View getView(int position, View convertView, ViewGroup parent) { VerticalViewHolder verticalViewHolder = null; if (convertView==null) { convertView = super.getView(position, convertView, parent); verticalViewHolder = new VerticalViewHolder(); verticalViewHolder.textview = (TextView) convertView.findViewById(R.id.textView); LayoutParams lp = (LayoutParams) verticalViewHolder.textview.getLayoutParams(); if (position==0) lp.setMargins(1, 2, 1, 0); else lp.setMargins(1, 0, 1, 0); convertView.setTag(verticalViewHolder); convertView.setTag(R.id.textView, verticalViewHolder.textview); } else { verticalViewHolder = (VerticalViewHolder) convertView.getTag(); } verticalViewHolder.textview.setText(l.get(position).get(ITEM)); return convertView; } }); } else { if (COLUMN_COUNT>=5) listview.setLayoutParams(new LayoutParams(parent.getWidth()/5, LayoutParams.WRAP_CONTENT)); else listview.setLayoutParams(new LayoutParams(parent.getWidth()/COLUMN_COUNT, LayoutParams.WRAP_CONTENT)); listview.setAdapter(new SimpleAdapter( getApplicationContext(), l, R.layout.viewitemitem, new String[] {ITEM}, new int[] {R.id.textView}) { @Override public View getView(int position, View convertView, ViewGroup parent) { View retval = super.getView(position, convertView, parent); TextView textview = (TextView) retval.findViewById(R.id.textView); LayoutParams lp = (LayoutParams) textview.getLayoutParams(); if (position==0) lp.setMargins(0, 2, 1, 0); else if (position==ROW_COUNT-1) lp.setMargins(0, 0, 1, 1); else lp.setMargins(0, 0, 1, 0); return retval; } }); } convertView.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { listview.setSmoothScrollbarEnabled(true); listview.dispatchTouchEvent(event); return false; } }); return convertView; } private List<Map<String, String>> createList() { List<Map<String, String>> values = new ArrayList<Map<String, String>>(); Map<String, String> v = new HashMap<String, String>(); for (int j = 0; j < ROW_COUNT; j++) { v = new HashMap<String, String>(); v.put(ITEM, ""+j); values.add(v); } return values; } }; }
HorizontalListView.java
package com.devsmart.android.ui; import java.util.LinkedList; import java.util.Queue; import android.content.Context; import android.database.DataSetObserver; import android.graphics.Rect; import android.util.AttributeSet; import android.view.GestureDetector; import android.view.GestureDetector.OnGestureListener; import android.view.MotionEvent; import android.view.View; import android.widget.AdapterView; import android.widget.ListAdapter; import android.widget.Scroller; public class HorizontialListView extends AdapterView<ListAdapter> { public boolean mAlwaysOverrideTouch = true; protected ListAdapter mAdapter; private int mLeftViewIndex = -1; private int mRightViewIndex = 0; protected int mCurrentX; protected int mNextX; private int mMaxX = Integer.MAX_VALUE; private int mDisplayOffset = 0; protected Scroller mScroller; private GestureDetector mGesture; private Queue<View> mRemovedViewQueue = new LinkedList<View>(); private OnItemSelectedListener mOnItemSelected; private OnItemClickListener mOnItemClicked; private boolean mDataChanged = false; public HorizontialListView(Context context, AttributeSet attrs) { super(context, attrs); initView(); } private synchronized void initView() { mLeftViewIndex = -1; mRightViewIndex = 0; mDisplayOffset = 0; mCurrentX = 0; mNextX = 0; mMaxX = Integer.MAX_VALUE; mScroller = new Scroller(getContext()); mGesture = new GestureDetector(getContext(), mOnGesture); } @Override public void setOnItemSelectedListener(AdapterView.OnItemSelectedListener listener) { mOnItemSelected = listener; } @Override public void setOnItemClickListener(AdapterView.OnItemClickListener listener){ mOnItemClicked = listener; } private DataSetObserver mDataObserver = new DataSetObserver() { @Override public void onChanged() { synchronized(HorizontialListView.this){ mDataChanged = true; } invalidate(); requestLayout(); } @Override public void onInvalidated() { reset(); invalidate(); requestLayout(); } }; @Override public ListAdapter getAdapter() { return mAdapter; } @Override public View getSelectedView() {
listviewdemo.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <com.devsmart.android.ui.HorizontialListView android:id="@+id/listview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#fff"/> </LinearLayout>
viewitem.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/viewitem_linearlayout" android:layout_width="wrap_content" android:layout_height="match_parent" > <ListView android:id="@+id/viewitem_listview" android:layout_width="wrap_content" android:layout_height="wrap_content" > </ListView> </LinearLayout>
viewitemitem.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/viewitemitem" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#fff" > <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#000" android:paddingLeft="3dp" android:text="@string/hello_world" /> </LinearLayout>