为了满足公司项目的需求做一个类似于苹果上UITabelView列表的编辑删除功能,整了好久总算弄出来了,虽然还有点小毛病,就是红色删除按钮显示的时候,Item上的内容没有整体左移,但是主要功能还是实现了,记录下先。。。。
BalancePlanHomeActivity.java页面代码如下:
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.http.RequestParams;
import com.lidroid.xutils.view.annotation.ViewInject;
import java.util.ArrayList;
import java.util.List;
public class BalancePlanHomeActivity extends BaseActivity {//BaseActivity为基类 @ViewInject(R.id.lv_balance_home)
private ListView balanceHomeListView;
//是否为编辑状态,为true时,每个item上的删除按钮都显示出来,“编辑”按钮文字变为“完成”;否则,反之。
private boolean isEditState;
private List<BalancePlanInfoBean> listInfos = new ArrayList<BalancePlanInfoBean>();//listview的显示数据
private BalanceHomeListAdapter balanceHomeListAdapter; //listview适配器
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentLayout(R.layout.balance_home);
ViewUtils.inject(this);
setTitle(getString(R.string.title_plan));
balanceHomeListAdapter = new BalanceHomeListAdapter(BalancePlanHomeActivity.this);
balanceHomeListView.setAdapter(balanceHomeListAdapter);
isEditState = false;
addClickListener();
}
private void addClickListener(){
findViewById(R.id.tv_title_right).setOnClickListener(this);
}
@Override public void onClick(View v) {
super.onClick(v);
switch (v.getId()){
case R.id.tv_title_right:
onEditTextViewClicked();
break;
default:break;
}
}
//编辑按钮点击事件
private void onEditTextViewClicked() {
isEditState = !isEditState;
if (isEditState){
setTvRightRes(R.string.list_finish);
balanceHomeListAdapter.setShowDeleteView(true);
}else {
setTvRightRes(R.string.list_edit);
balanceHomeListAdapter.setShowDeleteView(false);
}
balanceHomeListAdapter.notifyDataSetChanged();
}
@Override protected void onResume() {
super.onResume();
initData();//初始化数据
}
@Override protected void onPause() {
isEditState = true;
onEditTextViewClicked();
super.onPause();
}
//初始化数据
private void initData() {
clearDatas();
RequestParams params = getRequestParams();
if (params == null) return;
showProgressDialog();
HttpRequestFactory.sendBalancePlansRequest(BalancePlanHomeActivity.this, params, new HttpRequestListener<List<BalancePlanInfoBean>>() {
@Override
public void doSuccess(BaseBean<List<BalancePlanInfoBean>> result) {
dismissProgressDialog();
if (result == null || result.getData() == null) {
showHintDialog(R.string.no_data);
return;
}
listInfos.addAll(result.getData());
balanceHomeListAdapter.notifyDataSetChanged(listInfos);//刷新listview
addListItemClickListener();//实现listview上item的所有监听事件
}
@Override
public void doFailed(BaseBean<List<BalancePlanInfoBean>> result) {
dismissProgressDialog();
showHintDialog(result.getMsg());
}
});
}
private void clearDatas(){//清除数据
listInfos.clear();
balanceHomeListAdapter.getPlanInfoBeans().clear();
balanceHomeListAdapter.notifyDataSetChanged();
}
private RequestParams getRequestParams() {
RequestParams params = new RequestParams();
AccountBean account = HqtApplication.getAccount();
if (account == null) {
gotoLoginActivity(NormalLoginActivity.class, true);
return null;
}
params.addBodyParameter("userId", account.getUserId());
return params;
}
private void addListItemClickListener() {
balanceHomeListAdapter.setOnItemClickListener(new BalanceHomeListAdapter.OnItemClickListener() {
@Override public void detail(BalancePlanInfoBean plan) {
//item上详情按钮事件(跳转至详情页)
}
@Override public void modify(BalancePlanInfoBean planInfoBean) {//item上修改按钮事件(跳转至修改页面) }
@Override public void stop(BalancePlanInfoBean planInfoBean, BalanceHomeListAdapter.ViewHolder viewHolder) {
//item上终止按钮事件
}
@Override public void records(BalancePlanInfoBean planInfoBean) {
//item上历史记录按钮事件
}
});
}
}
此Activity对应的布局文件如下 :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/root_layout_padding_style">
<ListView
android:id="@+id/lv_balance_home"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/tabrow_margin_top"
android:divider="@null"
android:dividerHeight="0dp"
android:drawSelectorOnTop="false"
android:scrollbars="none">
</ListView>
</LinearLayout>
ListView上的每一项的布局如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/transparent"
android:gravity="center_vertical"
android:orientation="horizontal">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/cell_padding_top_bottom"
android:background="@color/white"
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
android:id="@+id/img_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/tabrow_edt_padding_left"
android:layout_marginRight="@dimen/tabrow_edt_padding_left"
android:src="@drawable/edit"
android:visibility="gone" />
<LinearLayout
android:id="@+id/layout_balance_home_cell"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.8"
android:orientation="vertical"
android:gravity="top|left">
<!--<include layout="@layout/horizontal_split_line" />-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginLeft="@dimen/table_padding_left"
android:paddingBottom="@dimen/cell_padding_top_bottom"
android:paddingTop="@dimen/cell_padding_top_bottom"
android:layout_marginRight="@dimen/table_padding_right">
<ImageView
android:id="@+id/img_bank"
android:layout_width="@dimen/bank_image_size"
android:layout_height="@dimen/bank_image_size"
android:src="@drawable/icon_default_bank" />
<TableLayout
style="@style/table_style">
<TextView
android:id="@+id/tv_bank_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/left_text_black"
android:textSize="@dimen/font_size_large"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableRight="@drawable/more_right_arrow" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="0dp"
android:layout_marginTop="0dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_weight="1"
android:gravity="left">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/balance_home_remain"
android:textSize="@dimen/font_size_middle"
android:textColor="@color/left_text_black"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/buy_apply_amount_unit"
android:textSize="@dimen/font_size_extra_small" />
<TextView
android:id="@+id/tv_remain_amount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/tv_text_image_padding"
android:textColor="@color/left_text_black"
android:textStyle="bold"
android:textSize="@dimen/font_size_large"
android:ellipsize="end"
android:singleLine="true"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_weight="1"
android:paddingLeft="@dimen/table_padding_left">
<TextView
android:id="@+id/tv_tips"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/balance_home_repay"
android:textColor="@color/left_text_black"
android:textSize="@dimen/font_size_middle"/>
<TextView
android:id="@+id/tv_trade_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/tv_text_image_padding"
android:textColor="@color/state_and_date_color_red"
android:textSize="@dimen/font_size_middle"
android:ellipsize="end"
android:singleLine="true"/>
</LinearLayout>
</LinearLayout>
</TableLayout>
</LinearLayout>
<include layout="@layout/horizontal_split_line" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_modify_plan"
style="@style/cell_btn_style"
android:text="@string/tv_repay_modify_text" />
<include layout="@layout/vertical_separator_line" />
<TextView
android:id="@+id/tv_plans_record"
style="@style/cell_btn_style"
android:text="@string/tv_credit_card_record_text"
android:layout_marginRight="@dimen/table_padding_right"
android:drawableRight="@drawable/more_right_arrow"/>
</LinearLayout>
<!--<include layout="@layout/horizontal_split_line" />-->
</LinearLayout>
<TextView
android:id="@+id/tv_delete"
android:layout_width="90dp"
android:layout_height="match_parent"
android:layout_weight="0.2"
android:background="@color/tab_text_pressed_color_red"
android:gravity="center"
android:text="@string/delete"
android:textColor="@color/text_white"
android:textSize="@dimen/font_size_extra_large"
android:visibility="gone" />
</LinearLayout>
</LinearLayout>
自定义ListView的适配器代码如下;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class BalanceHomeListAdapter extends BaseAdapter {
private Context mContext;
private LayoutInflater inflater;
private List<BalancePlanInfoBean> planInfoBeans;//listview显示的数据
private OnItemClickListener onItemClickListener;
public boolean isShowDeleteView;//是否显示删除按钮
public boolean isShowDeleteView() {
return isShowDeleteView;
}
public void setShowDeleteView(boolean isShowDeleteView) {
this.isShowDeleteView = isShowDeleteView;
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
public BalanceHomeListAdapter(Context mContext) {
this.mContext = mContext;
inflater = LayoutInflater.from(mContext);
}
public BalanceHomeListAdapter(Context context, List<BalancePlanInfoBean> lists) {
this.mContext = context;
inflater = LayoutInflater.from(context);
if (this.planInfoBeans != null){
this.planInfoBeans.clear();
}else {
planInfoBeans = new ArrayList<BalancePlanInfoBean>();
}
this.planInfoBeans.addAll(lists);
}
//更新数据
public void notifyDataSetChanged(List<BalancePlanInfoBean> list) {
if (this.planInfoBeans != null){
this.planInfoBeans.clear();
}else {
planInfoBeans = new ArrayList<BalancePlanInfoBean>();
}
this.planInfoBeans.addAll(list);
super.notifyDataSetChanged();
}
@Override
public int getCount() {//获取item总数
return planInfoBeans == null ? 0 : planInfoBeans.size();
}
@Override
public Object getItem(int position) {//获取指定位置position的item
return planInfoBeans.get(position);
}
@Override
public long getItemId(int position) {//获取指定<span style="font-family: Arial, Helvetica, sans-serif;">位置position的itemId</span>
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {//获取每一项item视图
if (convertView == null) {
convertView = inflater.inflate(R.layout.balance_home_item, null);
setupViews(convertView);
}
ViewHolder holder = (ViewHolder) convertView.getTag();
final BalancePlanInfoBean plan = planInfoBeans.get(position);
setupDatas(plan, holder);
addListenser(convertView, holder, plan);
return convertView;
}
private void setupViews(View convertView) {//获得item上所有控件
ViewHolder holder = new ViewHolder();
holder.bankImageView = (ImageView) convertView.findViewById(R.id.img_bank);
holder.bankNameTextView = (TextView) convertView.findViewById(R.id.tv_bank_name);
holder.historyRecordTextView = (TextView) convertView.findViewById(R.id.tv_plans_record);
holder.remainAmountTextView = (TextView) convertView.findViewById(R.id.tv_remain_amount);
holder.deleteImageView = (ImageView)convertView.findViewById(R.id.img_delete);
holder.deleteTextView = (TextView)convertView.findViewById(R.id.tv_delete);
holder.cellLayout = (LinearLayout)convertView.findViewById(R.id.layout_balance_home_cell);
holder.tradeDateTextView = (TextView)convertView.findViewById(R.id.tv_trade_date);
holder.modifyPlanTextView = (TextView)convertView.findViewById(R.id.tv_modify_plan);
convertView.setTag(holder);
}
private void setupDatas(BalancePlanInfoBean plan, ViewHolder holder){//设置item上显示数据
holder.bankImageView.setImageResource(FormatUtils.getBankImageResId(mContext, plan.getTrustChannelId()));
holder.bankNameTextView.setText(plan.getBankAccountNoDisplay());
holder.remainAmountTextView.setText(plan.getRemainAmountDisplay());
holder.tradeDateTextView.setText(plan.getTradeDatesDisplay());
if (isShowDeleteView){
holder.deleteImageView.setVisibility(View.VISIBLE);
}else {
holder.deleteImageView.setVisibility(View.GONE);
}
}
//绑定item上所有按钮的监听事件
private void addListenser(View convertView, final ViewHolder holder, final BalancePlanInfoBean planInfoBean) {
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
onItemClickListener.detail(planInfoBean);
}
});
holder.historyRecordTextView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (((BalancePlanHomeActivity) mContext).clickToFast()) {
return;
}
onItemClickListener.records(planInfoBean);
}
});
holder.modifyPlanTextView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (((BalancePlanHomeActivity) mContext).clickToFast()) {
return;
}
onItemClickListener.modify(planInfoBean);
}
});
holder.deleteImageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (((BalancePlanHomeActivity) mContext).clickToFast()) {
return;
}
holder.deleteImageView.setVisibility(View.GONE);
holder.deleteTextView.setVisibility(View.VISIBLE);
}
});
holder.deleteTextView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (((BalancePlanHomeActivity) mContext).clickToFast()) {
return;
}
onItemClickListener.stop(planInfoBean, holder);
}
});
}
public List<BalancePlanInfoBean> getPlanInfoBeans() {
if (planInfoBeans == null){
planInfoBeans = new ArrayList<BalancePlanInfoBean>();
}
return planInfoBeans;
}
public static class ViewHolder {//item上的所有控件
ImageView bankImageView;
TextView bankNameTextView;
TextView historyRecordTextView;
TextView modifyPlanTextView;
TextView remainAmountTextView;
ImageView deleteImageView;
LinearLayout cellLayout;
public TextView deleteTextView;
TextView tradeDateTextView;
}
public interface OnItemClickListener {
//详情界面
void detail(BalancePlanInfoBean credit);
//修改
void modify(BalancePlanInfoBean planInfoBean);
//终止
void stop(BalancePlanInfoBean planInfoBean, ViewHolder viewHolder);
//历史记录
void records(BalancePlanInfoBean planInfoBean);
}
}