最近研究了一下微信的一些ui效果,都挺有意思的,其中有一个就是listview中可以滑动的item,。。。
起初在github上也有几个类似的demo,连接如下:https://github.com/47deg/android-swipelistview
ps:比较复杂
参考前人写了一个类似的功能。。。大家来吐槽
主要思路就是listview的item用一个HorizontalScrollView来作为根目录,监听convertview的onTouch事件,通过HorizontalScrollView的滑动距离来决定是否要显示item中额外的功能项PS:这里面有个比较重要的地方就是:我们在getView的时候要重新设置LayoutParams params = (LayoutParams) holder.ll_content.getLayoutParams();params.width = dm.widthPixels;让当前内容沾满屏幕
直接来代码:
item.xml
<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/hs"
>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<LinearLayout
android:id="@+id/ll_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/tv_content"
android:gravity="center"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/ll_action"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_del"
android:text="Delete"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_share"
android:text="Share"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_view"
android:text="View"
/>
</LinearLayout>
</LinearLayout>
</HorizontalScrollView>
main.xml
<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"
>
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/lv"
/>
</RelativeLayout>
package com.example.swiplistview;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.R.integer;
import android.app.Activity;
import android.util.DisplayMetrics;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity
{
ListView listView;
List<String> infos = new ArrayList<String>();
DisplayMetrics dm;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_main );
listView = (ListView) findViewById( R.id.lv );
for ( int i = 0; i < 5; i++ )
{
infos.add( "info " + i );
}
dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics( dm );
SwipAdapter adapter = new SwipAdapter();
listView.setAdapter( adapter );
}
class SwipAdapter extends BaseAdapter
{
@Override
public int getCount()
{
// TODO Auto-generated method stub
return infos.size();
}
@Override
public CharSequence getItem(int position)
{
// TODO Auto-generated method stub
return infos.get( position );
}
@Override
public long getItemId(int position)
{
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
// TODO Auto-generated method stub
final Viewholder holder;
if (convertView == null)
{
convertView = View.inflate( MainActivity.this, R.layout.item, null );
holder = new Viewholder();
holder.ll_content = (LinearLayout) convertView.findViewById( R.id.ll_content );
holder.ll_action = (LinearLayout) convertView.findViewById( R.id.ll_action );
holder.tv_content = (TextView) convertView.findViewById( R.id.tv_content );
holder.btn_del = (Button) convertView.findViewById( R.id.btn_del );
holder.btn_share = (Button) convertView.findViewById( R.id.btn_share );
holder.btn_view = (Button) convertView.findViewById( R.id.btn_view );
holder.hs = (HorizontalScrollView) convertView.findViewById( R.id.hs );
// 设置ll_content的宽度为屏幕宽度
LayoutParams params = (LayoutParams) holder.ll_content.getLayoutParams();
params.width = dm.widthPixels;
convertView.setTag( holder );
}
else
{
holder = (Viewholder) convertView.getTag();
}
holder.tv_content.setText( getItem( position ) );
convertView.setOnTouchListener( new OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
switch (event.getAction())
{
case MotionEvent.ACTION_UP:
int x = holder.hs.getScrollX();
int width = holder.ll_action.getWidth();
if (x < width / 2)
{
holder.hs.scrollBy( 0, 0 );
}
else
{
holder.hs.smoothScrollBy( width, 0 );
}
break;
default:
break;
}
return false;
}
} );
holder.btn_del.setOnClickListener( new OnClickListener()
{
@Override
public void onClick(View v)
{
infos.remove( position );
notifyDataSetChanged();
}
} );
// 这里防止删除一条item后,ListView处于操作状态,直接还原
if (holder.hs.getScaleX() != 0)
{
holder.hs.scrollTo( 0, 0 );
}
return convertView;
}
final class Viewholder
{
LinearLayout ll_content;
LinearLayout ll_action;
TextView tv_content;
Button btn_del;
Button btn_share;
Button btn_view;
HorizontalScrollView hs;
}
}
}