5

我有一个包含 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>

内行布局,可在一行中任意多次复制

<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" />

基础适配器

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;
    }
}

我的问题

看看附上的截图。我的问题是每行中一次显示多个视图。

我希望一次只向用户显示一个视图,其余的用户所要做的就是从左向右或从右向左滑动。

在此处输入图像描述

4

4 回答 4

4

注意:不是一个理想的解决方案,但应该提供你想要的。另一个注意:这可能会使你的列表视图有点卡,具体取决于布局复杂性

@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;
    }
于 2013-11-14T07:34:01.827 回答
2

问题在于您的适配器:

  1. getCount()从您的适配器必须返回列表中的总数。返回20在您的上下文中无效 - 您的列表中似乎有 20 项。你应该回来dataSet.size();
  2. getItem()应该从模型数据结构中返回项目,在这种情况下:

以下

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

此外,您的getView方法必须返回在给定 atposition参数处显示模型数据的视图。返回一个ViewGroup没有意义的虚拟数据是你目前所拥有的。您应该获取ArrayList<DwivediJi>from 参数位置(通过dataSet.get(position))并构造/膨胀一个正确显示此数据结构项的视图。

于 2013-11-14T07:22:01.147 回答
0

将内部布局宽度更改为 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 ?

于 2013-11-14T07:19:35.340 回答
0

在xml布局中使用scrollview,然后在for循环内动态创建Horizo​​ntalScrollView:

例子 :

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);
}
于 2013-11-14T07:20:44.657 回答