Горизонтальное прокручивание в виде списка элементов Android

У меня есть представление списка с 20 строками, и я хочу настроить горизонтальное scrollview для каждого элемента строки в представлении списка, так как каждая строка содержит более одного элемента.

Вот мой код:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <HorizontalScrollView android:id="@+id/hor_scroll" android:layout_width="match_parent" android:layout_height="wrap_content" android:scrollbars="none" > <LinearLayout android:id="@+id/mainLinear" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > </LinearLayout> </HorizontalScrollView> </RelativeLayout> 

Макет Inner Row, который должен повторяться в строке сколько угодно раз

 <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_marginRight="6.0dip" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="fill_parent" android:gravity="center_vertical" android:text="Example Value" android:textAppearance="?android:textAppearanceMedium" /> 

BaseAdapter

 public class HorizontalListViewAdapter extends BaseAdapter { private Context context; private ArrayList<ArrayList<DwivediJi>> dataSet; public HorizontalListViewAdapter(Context context) { this.context = context; } @Override public int getCount() { return 20; } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return arg0; } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return arg0; } @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.horizontal_list_item, null,false); LinearLayout mainLinnerLayout=(LinearLayout)convertView.findViewById(R.id.mainLinear); for (int i = 0; i <5; i++) { View additionView = inflater.inflate(R.layout.inner_layout_file, null,false); LinearLayout innerLinnerLayout=(LinearLayout)additionView.findViewById(R.id.inner_layout); mainLinnerLayout.addView(innerLinnerLayout); } return convertView; } class ViewHolder { TextView tv_titleExample; HorizontalScrollView hzView; LinearLayout linear_layout,main_linear_layout; } } 

Моя проблема

Посмотрите на прилагаемый скриншот. Моя проблема заключается в том, что одновременно отображается несколько представлений в каждой строке.

Я хочу, чтобы только одно представление отображалось пользователю в одно время, а остальное, что должен сделать пользователь, – это прокручивать влево или вправо или вправо.

Введите описание изображения здесь

Примечание. Не идеальное решение, но должно обеспечить то, что вы хотите. Другое примечание. Это может сделать ваш список незначительным, в зависимости от сложности компоновки

 @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.horizontal_list_item, null,false); LinearLayout mainLinnerLayout=(LinearLayout)convertView.findViewById(R.id.mainLinear); for (int i = 0; i <5; i++) { View additionView = inflater.inflate(R.layout.inner_layout_file, null,false); LinearLayout innerLinnerLayout=(LinearLayout)additionView.findViewById(R.id.inner_layout); // If the width varies for each innerLinnerLayout, then remove the if block & always calculate padding value // padding is an integer initialized to -1 in the constructor if (padding == -1) { int width = context.getResources().getDisplayMetrics().widthPixels; innerLinnerLayout.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); padding = width - additionView.getMeasuredWidth(); } // I've set padding to right only, but you could center it by giving left and right padding of value=(padding/2) innerLinnerLayout.setPadding(0, 0, padding, 0); mainLinnerLayout.addView(innerLinnerLayout); } return convertView; } 

Проблема заключается в том, что ваш адаптер:

  1. getCount() из вашего адаптера должен вернуть общее число из списка. Возврат 20 недействителен в вашем контексте – и у вас, кажется, есть 20 элементов в вашем списке. Вы должны вернуть dataSet.size();
  2. getItem() должен возвращать элемент из структуры данных модели, в этом случае:

Ниже

 @Override public Object getItem(int position) { // TODO Auto-generated method stub return dataSet.get(position); } 

Кроме того, ваш метод getView должен возвращать представление, которое отображает данные модели при заданном параметре position . Возвращение ViewGroup с не ViewGroup фиктивными данными – это то, что вы в настоящее время имеете. Вы должны получить ArrayList<DwivediJi> из позиции параметра (через dataSet.get(position) ) и построить / раздуть представление, которое правильно отображает этот элемент структуры данных.

Измените внутреннюю ширину макета на match_parent. Это должно помочь вам

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_marginRight="6.0dip" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="fill_parent" android:gravity="center_vertical" android:text="Example Value" android:textAppearance="?android:textAppearanceMedium" /> </LinearLayout> 

Кажется, вы добавляете свой внутренний макет в этот LinearLayout

 <LinearLayout android:id="@+id/mainLinear" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > </LinearLayout> 

Вы тоже пытались изменить свою ширину на match_parent?

Используйте scrollview в макете xml, а затем динамически создайте HorizontalScrollView внутри цикла:

пример :

 for(int i.......) //number of HorizontalScrollView needed { HorizontalScrollView mainlinear = new HorizontalScrollView( getApplicationContext()); for(int i.......) //number of items wants to add in HorizontalScrollView { // adding any widgets as per your requirements } mainlinear.addView(Widgetname); scroll.addView(mainlinear); }