由于某些原因,需要个错位的页面,在网上找不到好的例子,试着动手写了写。

不考虑配色的完成图如下:

首先考虑的是,listview每一行左右都有可能缩进。

先假设一行的布局就是ImageView,TextView,ImageView,代码如下:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> <RelativeLayout
android:id="@+id/rl_line"
android:layout_width="match_parent"
android:layout_height="50dp"> <ImageView
android:id="@+id/iv_left"
android:layout_width="50dp"
android:background="#cccccc"
android:layout_height="match_parent"/> <ImageView
android:id="@+id/iv_right"
android:layout_width="50dp"
android:background="#cccccc"
android:layout_height="match_parent"
android:layout_alignParentRight="true"/> <TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_toRightOf="@id/iv_left"
android:layout_toLeftOf="@id/iv_right"
android:background="#ffffff"
android:text="example"
android:textSize="17sp"/> </RelativeLayout> </LinearLayout>

接下来要考虑,如何保证一行靠左,一行靠右呢?

可以通过判断行数,来选择ImageView是否显示,大致如下:

         if(position % 2 == 0){
holder.iv_left.setVisibility(View.GONE);
holder.iv_right.setVisibility(View.VISIBLE);
}
else{
holder.iv_left.setVisibility(View.VISIBLE);
holder.iv_right.setVisibility(View.GONE);
}

之所以还要设置Visibile,是因为第一项和最后一项因为某些原因,会不隐藏ImageView。

这处代码也可以精简。

完成的自定义Adapter如下:

 public class ListviewAdapter extends BaseAdapter{
private LayoutInflater inflater;
private ViewHolder holder;
private int index = 0;
private Context c;
private String string[]; public ListviewAdapter(Context c,String[] string){
super();
this.c = c;
this.string = string;
inflater = LayoutInflater.from(c);
} @Override
public int getCount() {
// TODO Auto-generated method stub
return string.length;
} @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
} @Override
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
holder = new ViewHolder();
if(convertView == null){
convertView = inflater.inflate(R.layout.mylistview, null);
holder.tv = (TextView)convertView.findViewById(R.id.tv);
holder.iv_left = (ImageView)convertView.findViewById(R.id.iv_left);
holder.iv_right = (ImageView)convertView.findViewById(R.id.iv_right);
convertView.setTag(holder);
}
else
holder = (ViewHolder) convertView.getTag();
holder.tv.setText(string[position]); if(position % 2 == 0){
holder.iv_left.setVisibility(View.GONE);
holder.iv_right.setVisibility(View.VISIBLE);
}
else{
holder.iv_left.setVisibility(View.VISIBLE);
holder.iv_right.setVisibility(View.GONE);
}
return convertView;
} public class ViewHolder{
public TextView tv;
public ImageView iv_left;
public ImageView iv_right;
} }

ListviewAdapter.java

由于两个ImageView设置了颜色为#cccccc,为了保证看起来像一体的,listview的间距和整个页面背景都要设置为#CCCCCC。

activity_main的代码如下:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#cccccc"
tools:context="com.example.listviewdemo.MainActivity" > <ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="#cccccc"
android:dividerHeight="18dp"/> </RelativeLayout>

activity_main.xml

以及MainActivity:

 public class MainActivity extends Activity {
private ListView lv;
private ListviewAdapter adapter;
private String[] list = new String[]{"aaa","bbb","ccc","ddd","eee",
"111","222","333","444","555"}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView)findViewById(R.id.lv);
adapter = new ListviewAdapter(this,list);
lv.setAdapter(adapter); lv.setOnItemClickListener(new myOnItemClickListener()); } private class myOnItemClickListener implements OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(getApplicationContext(), "您选择的是:" + list[position],
Toast.LENGTH_SHORT).show();
}
} public void onBackPressed() {
// TODO Auto-generated method stub
super.onBackPressed();
} }

MainActivity.java

因为只考虑了实现页面,没有考虑功能,故点击操作只有Toast提示。

如果有好的点子,大概会用这个样式写点什么吧

这样的布局好不好看,仁者见仁智者见智……

2015.8.13更新:

试着改了改,弄出下面的效果图:

事实证明,还是有点用处的嘛(我果然太闲了……)

Android中ListView错位布局实现(无聊向)的更多相关文章

  1. Android中ListView控件的使用

    Android中ListView控件的使用 ListView展示数据的原理 在Android中,其实ListView就相当于web中的jsp,Adapter是适配器,它就相当于web中的Servlet ...

  2. android中ListView点击和里边按钮点击不能同时生效问题解决

    今天遇到一个问题:android中ListView点击和里边button点击不能同时生效问题解决. 原因是: listView 在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得 ...

  3. Android中的LinearLayout布局

    LinearLayout : 线性布局 在一般情况下,当有很多控件需要在一个界面列出来时,我们就可以使用线性布局(LinearLayout)了,  线性布局是按照垂直方向(vertical)或水平方向 ...

  4. Android中Listview点击item不变颜色以及设置listselector 无效

    Android中Listview点击item不变颜色以及设置listselector 无效 这是同一个问题,Listview中点击item是会变颜色的,因为listview设置了默认的listsele ...

  5. Android中的五大布局

    Android中的五大布局 1.了解布局 一个丰富的界面总是要由很多个控件组成的,那我们如何才能让各个控件都有条不紊地 摆放在界面上,而不是乱糟糟的呢?这就需要借助布局来实现了.布局是一种可用于放置很 ...

  6. android中ListView控件&&onItemClick事件中获取listView传递的数据

    http://blog.csdn.net/aben_2005/article/details/6592205 本文转载自:android中ListView控件&&onItemClick ...

  7. Android中ListView无法点击

    Android中ListView无法点击 转自:http://xqjay19910131-yahoo-cn.iteye.com/blog/1319502   问题描述: ListView中Item加入 ...

  8. android中的常用布局管理器(三)

    接上篇博客 (5)TableLayout     表格布局管理器 在android中,线性布局和表格布局用的是最多的. 在很多的输出操作中,往往会使用表格的形式对显示的数据进行排版,tablelayo ...

  9. Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案

    我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如L ...

随机推荐

  1. 那些年,我们一起疯狂的C#

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  2. Lua-面向对象中函数使用时冒号(:)和点(.)的区别

    先来看一段简单的代码: local Animal = {} function Animal:Eat( food ) print("Animal:Eat", self, food) ...

  3. [ASP.NET MVC] 使用CLK.AspNet.Identity提供依权限显示选单项目的功能

    [ASP.NET MVC] 使用CLK.AspNet.Identity提供依权限显示选单项目的功能 CLK.AspNet.Identity CLK.AspNet.Identity是一个基于ASP.NE ...

  4. jQuery Label Better – 友好的表单输入框提示插件

    jQuery Label Better 帮助你标记您的表单输入域,带有美丽的动画效果而且不占用空间.这个插件的独特之处在于所有你需要做的就是添加一个占位符文本,只有当用户需要它的时候才显示标签. 您可 ...

  5. 第三届“HTML5峰会”变身“iWeb峰会”8月来袭

    第三届“HTML5峰会”——2000人规模的“iWeb峰会”将于8月16日在北京召开.本次大会由HTML5梦工场主办,是在前两届“HTML5峰会”基础上的延伸和升华. 三年以来,HTML5梦工场致力于 ...

  6. Swift设置自动行高

    // 设置行高自适应 tableView.rowHeight = UITableViewAutomaticDimension // 设置预估行高 tableView.estimatedRowHeigh ...

  7. Android 视频播放器切换到下个视频时残留上个视频画面的解决办法

    最近在做一个Android视频播放器,遇到一个问题:切换到下一个视频时,中间会停留上一个视频的残存画面.   这是怎么回事?   我在网上找了很多资料,终于找到了原因:我是用自定义一个surfacev ...

  8. 【读书笔记】iOS-ARC-循环引用-解决办法

    一,循环引用最常见的代码类型. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading ...

  9. 【Android】不使用WebView来执行Javascript脚本(Rhino)

    前言 动态执行脚本能有效的降低重要功能硬编码带来的问题,尤其是依赖于第三方的应用,可以通过动态脚本+在线参数(例如友盟在线参数)再不更新应用的情况下升级功能. 声明 欢迎转载,但请保留文章原始出处:) ...

  10. iOS--归档和解档(Archiver)、(UnArchiver)

    一.已有类型的归档和解档 首先来看一个简单的例子: //第一方式:归档对象 //对象-->文件 NSArray *array = [NSArray arrayWithObjects:@" ...