【学习】ListView子控件的监听及刷新数据不变

listview是很有用的一个控件。但我觉得这个真是难。折磨死我了。

废话不谈了。关于listview的基础的知识也不讲了。

listview中添加控件并且对控件进行监听。

开始的时候我直接在设置了adpater后就为listview里面的控件增加监听函数。但是却发现不仅控件的监听器无法促发。就连listview本身也无法触发。看了很多资料。算是见识了。其实就是个焦点的问题。(这个问题以后再讨论。我也没搞透)

上一张图先

在这个item中我放了两个button。要实现对中间文本的加减控制。开始的时候我用的是simpleadapter。发现无论怎么弄都无法完成这个任务。因为根本触发不了button的监听器。后来得大神相助。给力的一段代码。自定义adpter继承baseadapter





package com.example.test;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.R.integer;
import android.app.AlertDialog;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import android.util.Printer;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.Toast;

public class MySimpleAdapter extends BaseAdapter {
	private LayoutInflater mInflater;
	private List<Map<String, Object>> list;
	private int layoutID;
	private String flag[];
	private int ItemIDs[];
	private Context context;
    private String p;
    private String mynums[];
	public MySimpleAdapter(Context context, List<Map<String, Object>> list,
			int layoutID, String flag[], int ItemIDs[],String mynums[]) {
		this.mInflater = LayoutInflater.from(context);
		this.list = list;
		this.layoutID = layoutID;
		this.flag = flag;
		this.ItemIDs = ItemIDs;
		this.context = context;
		this.mynums=mynums;
		this.p="0";
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return list.size();
	}

	@Override
	public Object getItem(int arg0) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public long getItemId(int arg0) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public View getView(final int position, View convertView, ViewGroup parent) {
		if (convertView == null)

			convertView = mInflater.inflate(layoutID, null);
		for (int i = 0; i < flag.length; i++) {// 备注1
			if (convertView.findViewById(ItemIDs[i]) instanceof ImageView) {
				ImageView iv = (ImageView) convertView.findViewById(ItemIDs[i]);
				iv.setImageResource((Integer) list.get(position).get(flag[i]));
			} else if (convertView.findViewById(ItemIDs[i]) instanceof TextView) {
				TextView tv = (TextView) convertView.findViewById(ItemIDs[i]);
				if (tv.getId() == R.id.foodtext) {
					tv.setText(this.mynums[position]);
					break;
				}
				tv.setText((String) list.get(position).get(flag[i]));
			} else {
				// ...备注2
			}
		}

		final TextView tv = (TextView) convertView.findViewById(R.id.foodtext);
		((Button) convertView.findViewById(R.id.SUB))
				.setOnClickListener(new View.OnClickListener() {
					@Override
					public void onClick(View v) {
						String n = (String) tv.getText();
						int m = Integer.parseInt(n);
						if (m == 1) {
							tv.setTextColor(android.graphics.Color.BLACK);
							m--;
							tv.setText(m + "");
							return;
						}
						if (m == 0)
							return;
						m--;
						tv.setText(m + "");
						tv.setTextColor(android.graphics.Color.RED);

					}
				});

		// 为加号的按钮添加监听事件
		((Button) convertView.findViewById(R.id.ADD))
				.setOnClickListener(new View.OnClickListener() {
					@Override
					public void onClick(View v) {
						String n = (String) tv.getText();
						int m = Integer.parseInt(n);
						m++;
						tv.setText(m + "");
						n = m + "";
						tv.setTextColor(android.graphics.Color.BLUE);
						p=n;
						mynums[position]=p;
					}
				});
		return convertView;
	}
}

而为什么这样做就可以达到对子控件监听的目的呢。

这就要探讨一下listview的显示问题。相信这个问题已经有很多先辈们说过了。我这里说一下就是让自己以后复习起来可以更方便一些。

listview每次显示一个item都会回调

public View getView(final int position, View convertView, ViewGroup parent)
这个函数有三个参数。第一个是这个item在整个列表中的位置。第一个item就是position 0第二个就是position 1.

第二个参数就是一个item的view了。我觉得系统传入这个参数就是为了方便returen回去的。

开始创建item的时候是没有item的。所以没有view。传入的也是一个空值。到了后来传入的是已经存在的view了。这个大家可以百度一下。网上太多了。

而在这个里面。最让我头疼就是中间的文本显示数量的那个。点击add或者sub它发生变化。但是等这个item到了阴影处再回来的时候它又变成0了。

问了很多人。看来很多资料。还是搞不定。可能是基础比较差。但是学习嘛。就是要不停客服苦难。在经历了无数次。un幸运之后。终于是给搞定了。

要想把这个数量对应的保存起来。然后再geiview中去判断。这个文本是不是用来显示数量的。

mynums[position]=p;
这句代码是为了将数量放进数组中存储起来。(开始的时候我的思想也是这样的。但是在初始化数组的时候一直报错。后来就直接当做参数让它传进来。)

if (tv.getId() == R.id.foodtext) {
					tv.setText(this.mynums[position]);
					break;
				}
这个判断就是为了判断这个文本是不是用来显示数量的。如果是就显示刚才数组对应的值。这样就达到了保存数据的作用了。

(这里我只是实现了add的数据保存。)

好了。终于是几天的熬夜没有白费啊。虽然过程很坎坷。一个人写东西。没人教。很心酸。碰到问题很棘手。但身为一个要编程的男人。这都不是事。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值