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

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

首先考虑的是,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. Volatile实现原理

    volatile 在多线程上volatile 是synchronized 轻量级实现.在多核处理器开发中保证了共享变量的"可见性".可见性是指当一个线程修改一个共享变量的时候,另外 ...

  2. get()和post()方法编码的区别

    在做ssh搭建的框架中,在后台条件查询的时候,组合查询传到后台的值一直是乱码,其中在form表单中必须要加上method,这一点是肯定的,但是加上了提交的方式之后,会出现如下问题: 如果使用get方法 ...

  3. Quartz任务调度器

    在使用jdk的timer时发现无法满足开发需求:即无法在指定的日期进行执行任务. 这便引入一个优秀的开源任务调度框架“quartz”.   这里加入的是quartz-1.8.6版本.Quart的官网: ...

  4. 使用Yeoman快速启动AngularJS项目开发

    本博客停止更新,请访问新个人博客:owenchen.net 前言 博客迁移到了BAE上,http://owenchen.net/,以后的文章会首发在自己的博客上,随后在博客园发布. 很久没有写文章了, ...

  5. bootstrap字体图标在谷歌显示正常,在火狐显示异常的问题

    bootstrap字体图标的使用 现在有很多的网站支持字体图标,我所知道的有bootstrap,fontawesome,iconmoon,等等,可能还有其他我并不知道 bootstrap只要你的文件夹 ...

  6. Maven发布工程到公共库

    1.发布工程 新建一个 Maven build 选择要发布的工程

  7. 总结CSS3新特性(Transition篇)

    CSS 过渡(transition), 是 CSS3 规范的一部分, 用来控制 CSS 属性的变化速率. 可以让属性的变化过程持续一段时间,而不是立即生效.比如,将元素的颜色从白色改为黑色,通常这个改 ...

  8. C# 操作PPt,去掉文本框的边框

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using OFFICECO ...

  9. iOS启动过程

    1.main函数 | 2.UIApplicationMain      * 创建UIApplication对象      * 创建UIApplication的delegate对象 | 3.delega ...

  10. Android Studio教程--从Github 下载一个Repository

    从电脑上彻底删除HelloWorld项目 回到as欢迎页面 复制github中项目的地址 点击clone