ListView的多布局显示

关于ListView的多布局,我们经常可以在QQ聊天、微信聊天等见到这种情况,这里简单介绍ListVIew的简单聊天布局(两个布局),如果需要更多布局,只需根据相同的原理添加新布局就可


效果图

这里写图片描述


如果需要例子源码,请点击链接:http://pan.baidu.com/s/1jIFIxQe 密码:6bhv

Acitvity中的代码

 //Msg为一个Ben类,包含type(类型判断),msg(数据信息)
        List<Msg> list=new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            Msg msg=new Msg();
            if(i%2==0)
            {
                msg.type=MyAdapter.TYPE1;
                msg.msg="这是左边的消息"+i;
            }else {
                msg.type=MyAdapter.TYPE2;
                msg.msg="这是右边的消息"+i;
            }
            list.add(msg);
        }
        MyAdapter adapter=new MyAdapter(this,list);
        ListView listView= (ListView) findViewById(R.id.listView);
        listView.setAdapter(adapter);

核心代码MyAdapter

public class MyAdapter extends BaseAdapter {

    List<Msg> list;
    LayoutInflater inflater;

     //定义两个常量,分别对应布局种类数量
    // 数字必须充0开始,且数字大小必须小于种类数量,否则会报ArrayIndexOutOfBoundsException异常
    public static final int TYPE1 = 0;
    public static final int TYPE2 = 1;
//构造方法
    public MyAdapter(Context context, List<Msg> list) {
        this.list = list;
        inflater = LayoutInflater.from(context);
    }
//返回集合数据源大小
    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }
    @Override
    public long getItemId(int position) {
        return position;
    }
    //多布局时必须返回布局种类数量
    @Override
    public int getViewTypeCount() {
        return 2;
    }

    //多布局时必须返回每个布局的类型
    @Override
    public int getItemViewType(int position) {
        return list.get(position).type;
    }

    //这里的方法跟单布局一样,只是多了一个判断,重写了一些重复的代码而已
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHoler1 holer1 = null;
        ViewHoler2 holer2 = null;
        if (convertView == null) {
            switch (list.get(position).type) {
                case TYPE1: {
                    convertView = inflater.inflate(R.layout.list_item_left, parent,false);
                    holer1 = new ViewHoler1();
                    holer1.imageView1 = (ImageView) convertView.findViewById(R.id.iv_head_left);
                    holer1.textView1 = (TextView) convertView.findViewById(R.id.tv_msg_left);
                    convertView.setTag(holer1);
                }
                break;
                case TYPE2: {
                    convertView = inflater.inflate(R.layout.listview_item_rigth, parent,false);
                    holer2 = new ViewHoler2();
                    holer2.imageView2 = (ImageView) convertView.findViewById(R.id.iv_head_right);
                    holer2.textView2 = (TextView) convertView.findViewById(R.id.tv_msg_right);
                    convertView.setTag(holer2);
                }
                break;
            }
        } else {
            //当convertView不为空时
            switch (list.get(position).type) {
                case TYPE1: {
                    holer1 = (ViewHoler1) convertView.getTag();
                }
                break;
                case TYPE2: {
                    holer2 = (ViewHoler2) convertView.getTag();
                }
                break;
            }
        }
        //按照类型设置数据
        switch (list.get(position).type) {
            case TYPE1: {
                holer1.textView1.setText(list.get(position).msg);
            }
            break;
            case TYPE2: {
                holer2.textView2.setText(list.get(position).msg);
            }
            break;

        }
        return convertView;
    }
    //==============================================================
    //设置ViewHoler区域
    class ViewHoler1 {
        ImageView imageView1;
        TextView textView1;
    }
    class ViewHoler2 {
        ImageView imageView2;
        TextView textView2;
    }

}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 你可以使用WPF ListView的ItemsPanel属性来指定ListView项的布局方式。以下是一种实现横向布局的方法: 1. 在XAML中定义ListView,并将ItemsPanel属性设置为StackPanel: ``` <ListView ItemsSource="{Binding Items}"> <ListView.ItemsPanel> <ItemsPanelTemplate> <StackPanel Orientation="Horizontal" /> </ItemsPanelTemplate> </ListView.ItemsPanel> <ListView.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding}" /> </DataTemplate> </ListView.ItemTemplate> </ListView> ``` 2. 将StackPanel的Orientation属性设置为Horizontal。 这样,ListView的项将以横向布局方式呈现。你可以根据需要调整其它属性,例如间距、对齐方式等。 ### 回答2: WPF(Windows Presentation Foundation)是微软公司推出的用于创建Windows应用程序的框架。ListView是WPF中常用的控件之一,用于显示一组数据项的列表。默认情况下,ListView布局是纵向的,即数据项按垂直方向排列。如果需要实现ListView的横向布局,可以通过以下几个步骤来实现。 首先,在XAML文件中声明一个ListView控件,并设置其Orientation属性为Horizontal,这将使ListView变为横向布局。 ```csharp <ListView Width="500" Height="200" Orientation="Horizontal"> <!-- 在此处添加数据模板和数据绑定 --> </ListView> ``` 接下来,需要为ListView指定数据模板和数据绑定,以展示列表中的数据项。 ```csharp <ListView Width="500" Height="200" Orientation="Horizontal"> <ListView.ItemTemplate> <DataTemplate> <!-- 在此处定义数据项的布局和样式 --> </DataTemplate> </ListView.ItemTemplate> </ListView> ``` 在DataTemplate中可以定义数据项的布局和样式,例如可以使用StackPanel来水平排列数据项的内容。 ```csharp <ListView Width="500" Height="200" Orientation="Horizontal"> <ListView.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <!-- 在此处添加数据项的内容 --> </StackPanel> </DataTemplate> </ListView.ItemTemplate> </ListView> ``` 最后,在代码中通过数据绑定将数据项与ListView关联起来,以实现数据的显示和更新。 综上所述,通过设置ListView的Orientation属性为Horizontal,并在DataTemplate中使用StackPanel来横向布局数据项的内容,再通过数据绑定将数据与ListView关联,即可实现WPF中ListView的横向布局。 ### 回答3: WPF中的ListView控件默认的布局方式是纵向布局,即列表项垂直排列。如果想要实现ListView的横向布局,可以通过修改ItemPanel的布局方式来实现。 首先,我们需要把ListView的ItemsPanel修改为一个横向布局的面板,比如使用WrapPanel或者UniformGrid。通过修改ListView的ItemPanel属性,可以将默认的ItemsPanel修改为横向布局的面板,如下所示: ``` <ListView> <ListView.ItemsPanel> <ItemsPanelTemplate> <WrapPanel Orientation="Horizontal"/> </ItemsPanelTemplate> </ListView.ItemsPanel> <!--其他代码--> </ListView> ``` 这样,ListView中的列表项就会横向排列了。但是需要注意的是,如果内容过多,会导致横向排列的列表项超出窗口范围,因此还需要根据实际情况设置ListView的宽度或者调整WrapPanel的宽度来适应布局。 另外,还可以通过修改ListView的ItemContainerStyle来定制列表项的样式,使其适应横向布局。比如设置列表项的最小宽度、高度、边距等,以及设置水平对齐方式等。 之,通过修改ListView的ItemsPanel和ItemContainerStyle,可以实现ListView的横向布局,使列表项横向排列。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值