Android学习笔记——ListView

为了满足公司项目的需求做一个类似于苹果上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);

    }


}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值