Android 列表视图项中的水平滚动视图

Android 列表视图项中的水平滚动视图,android,listview,horizontalscrollview,Android,Listview,Horizontalscrollview,我有一个20行的列表视图,我想为列表视图中的每一行项目设置一个水平滚动视图,因为每一行包含多个项目 这是我的密码: <?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="wra

我有一个20行的列表视图,我想为列表视图中的每一行项目设置一个水平
滚动视图
,因为每一行包含多个项目

这是我的密码:

<?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>

要在一行中复制任意次数的内部行布局


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;
    }
}
公共类HorizontalListViewAdapter扩展了BaseAdapter{
私人语境;
私有ArrayList数据集;
公共水平ListViewAdapter(上下文){
this.context=上下文;
}
@凌驾
public int getCount(){
返回20;
}
@凌驾
公共对象getItem(int arg0){
//TODO自动生成的方法存根
返回arg0;
}
@凌驾
公共长getItemId(int arg0){
//TODO自动生成的方法存根
返回arg0;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
LayoutFlater充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
convertView=充气机。充气(R.layout.horizontal\u list\u项,null,false);
LinearLayout mainLinnerLayout=(LinearLayout)convertView.findViewById(R.id.mainLinear);

对于(inti=0;i更改内部布局宽度以匹配父级。这应该会对您有所帮助

<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
        android:id="@+id/mainLinear"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
    </LinearLayout>


您是否也尝试更改其宽度以匹配父对象???

在xml布局中使用scrollview,然后在循环内部动态创建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);
}

适配器的问题是:

  • 适配器中的
    getCount()
    必须返回列表中的总数。返回
    20
    在您的上下文中无效-并且您的列表中似乎有20项。您应该返回
    dataSet.size();

  • getItem()
    应该从模型数据结构返回项,在这种情况下:
  • 下面


    另外,您的
    getView
    方法必须返回在
    position
    参数处显示模型数据的视图。返回带有无意义的伪数据的
    ViewGroup
    是您当前拥有的。您应该从参数位置(通过
    dataSet.get(position)
    获取
    ArrayList
    )并构造/展开一个视图,以正确显示此数据结构项。

    注意:这不是一个理想的解决方案,但应该提供您想要的。。 另一个注意事项:根据布局的复杂性,这可能会使您的listview有点僵硬

    @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;
        }
    
    @覆盖
    公共视图getView(int位置、视图转换视图、视图组父视图){
    LayoutFlater充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
    convertView=充气机。充气(R.layout.horizontal\u list\u项,null,false);
    LinearLayout mainLinnerLayout=(LinearLayout)convertView.findViewById(R.id.mainLinear);
    
    对于(int i=0;我尝试更改id android:id=“@+id/mainLinear”的线性布局的宽度)为了匹配父视图,因为最终内部视图被添加到这个视图中。然后,我想到的唯一解决方案是在适配器类中呈现视图时在运行时设置宽度。有没有办法在列表行项目中使用视图分页器?我从未尝试过,但如果列表视图中的每个项目都是视图分页器,应该可以这样做。
    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return dataSet.get(position);
    }
    
    @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;
        }