Activity之间传递ArrayList<自定义类>数据

来源:互联网 发布:软件人才外包 编辑:程序博客网 时间:2024/05/18 14:12

本来想写得很简单的,但是想想那样可能会写好几篇吧,所以就都写在这里吧。先总的说下包含的内容吧,首先是Intent自定义数据的传送,之后银行账号的输入格式的控制,之后界面销毁时数据的返回,将跟新了的数据返回给上一层的activity

内容貌似挺丰富的,一步步来吧!

首先定义数据类但是要实现Serializable接口

public class GroupBankBean implements Serializable {private String id; // 记录编号private String bank_name;// 银行名字private String bank_number; // 银行卡号private String bank_code;// 银行编号private String user_name;// 银行名字private String bank_img;// 银行图标public String getId() {return id;}public void setId(String id) {this.id = id;}public String getBank_name() {return bank_name;}public void setBank_name(String bank_name) {this.bank_name = bank_name;}public String getBank_number() {return bank_number;}public void setBank_number(String bank_number) {this.bank_number = bank_number;}public String getBank_code() {return bank_code;}public void setBank_code(String bank_code) {this.bank_code = bank_code;}public String getUser_name() {return user_name;}public void setUser_name(String user_name) {this.user_name = user_name;}public String getBank_img() {return bank_img;}public void setBank_img(String bank_img) {this.bank_img = bank_img;}}
之后写一个包装类实现Parcelable接口,将自定义的类作为包装类的一部分传过去
//intent传数据的重写接口public class GroupBankUtil implements Parcelable {public String name;public ArrayList<GroupBankBean> list = new ArrayList<GroupBankBean>();@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeList(list);dest.writeString(name);}public static final Parcelable.Creator<GroupBankUtil> CREATOR = new Parcelable.Creator<GroupBankUtil>() {// 重写Creator@Overridepublic GroupBankUtil createFromParcel(Parcel source) {GroupBankUtil g = new GroupBankUtil();g.list = source.readArrayList(ArrayList.class.getClassLoader());g.name = source.readString();return g;}@Overridepublic GroupBankUtil[] newArray(int size) {return null;}};}
之后就是数据的传送与接收了主activity获取数据和发送数据
</pre><pre name="code" class="java">public class MainActivity extends Activity {private MainActivity myself = this;private LinearLayout iv_left, bankBtn, saveBtn;private TextView nameText, select_bankText, select_bankidText, balanceText,type_commonText, type_fastText, messageText;private EditText bank_cardEdit, accountEdit;private LinearLayout imag_bank;private String str, cardNum, outValue, chargeSys, pd, bankName;private InputStringWatcher inputStringWatcher;private GroupBankUtil bankUtil;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.take_money);// 在界面显示之前调用接口,显示数据iv_left = (LinearLayout) findViewById(R.id.iv_left);iv_left.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) {myself.finish();}});nameText = (TextView) findViewById(R.id.name);balanceText = (TextView) findViewById(R.id.balance);select_bankText = (TextView) findViewById(R.id.select_bank);select_bankidText = (TextView) findViewById(R.id.select_bankid);bankBtn = (LinearLayout) findViewById(R.id.bank);imag_bank = (LinearLayout) findViewById(R.id.layout_select_bank);imag_bank.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) {Intent intent = new Intent(myself, BankCardShowActivity.class);Toast.makeText(myself, "列表中的长度=" + bankUtil.list.size(),Toast.LENGTH_SHORT).show();intent.putExtra("list", bankUtil);startActivityForResult(intent, 1);}});bank_cardEdit = (EditText) findViewById(R.id.bank_card);inputStringWatcher = new InputStringWatcher(bank_cardEdit);bank_cardEdit.addTextChangedListener(inputStringWatcher);// 添加的字符串输入监听accountEdit = (EditText) findViewById(R.id.account);saveBtn = (LinearLayout) findViewById(R.id.save);saveBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) {cardNum = bank_cardEdit.getText().toString();if (cardNum.equals("")) {Toast.makeText(myself, "请输入银行卡号", Toast.LENGTH_SHORT).show();return;}if (cardNum.length() != 16 && cardNum.length() != 19) {Toast.makeText(myself, "请输入正确的银行卡号", Toast.LENGTH_SHORT).show();return;}outValue = accountEdit.getText().toString();if (outValue.equals("0")) {Toast.makeText(myself, "请输入正确的金额", Toast.LENGTH_SHORT).show();return;}bankName = select_bankText.getText().toString();chargeSys = select_bankidText.getText().toString();}});initData();}public void initData() {bankUtil = new GroupBankUtil();bankUtil.list = new ArrayList<GroupBankBean>();bankUtil.list.clear();for (int i = 0; i < 10; i++) {GroupBankBean bankBean = new GroupBankBean();bankBean.setId("id" + i);bankBean.setBank_name("中国工商银行" + i);bankBean.setBank_code("bank_code" + i);bankBean.setBank_img("bank_img" + 1);bankBean.setBank_number("622202181700294785" + 1);bankBean.setUser_name("大大" + 1);bankUtil.list.add(bankBean);}imag_bank.setVisibility(View.VISIBLE);nameText.setText(bankUtil.list.get(0).getUser_name());bank_cardEdit.setText(bankUtil.list.get(0).getBank_number());select_bankText.setText(bankUtil.list.get(0).getBank_name());select_bankidText.setText(bankUtil.list.get(0).getBank_code());}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {switch (requestCode) {case 1:if (data != null) {bankUtil = data.getParcelableExtra("list");Bundle MarsBuddle1 = data.getExtras();if (MarsBuddle1.getBoolean("flag")) {cardNum = MarsBuddle1.getString("banknumber").trim();chargeSys = MarsBuddle1.getString("bankcode");bankName = MarsBuddle1.getString("bankname");select_bankText.setText(bankName);bank_cardEdit.setText(cardNum);select_bankidText.setText(chargeSys);}Toast.makeText(myself, "列表中的长度=" + bankUtil.list.size(),Toast.LENGTH_SHORT).show();}break;}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}}
之后就是数据的接收子activity

public class BankCardShowActivity extends Activity {private BankCardShowActivity myself = this;private LinearLayout iv_left;// 返回private TextView title_txt;// 提示标题 页面标题private GroupBankUtil bankUtil;// 获取intent传过来的参数private ListView listView;private BankRecordAdapter adapter;private boolean flag = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.card_number_list);title_txt = (TextView) findViewById(R.id.title_txt);listView = (ListView) this.findViewById(R.id.card_lvcard); // 将listView与布局对象关联iv_left = (LinearLayout) findViewById(R.id.iv_left);iv_left.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) {myself.finish();}});bankUtil = this.getIntent().getParcelableExtra("list");title_txt.setText("选择银行卡");adapter = new BankRecordAdapter(myself, bankUtil.list,R.layout.card_number_item);listView.setAdapter(adapter);// 处理Item的点击事件listView.setOnItemClickListener(new OnItemClickListener() {public void onItemClick(AdapterView<?> parent, View view,int position, long id) {GroupBankBean getObject = bankUtil.list.get(position); // 通过position获取所点击的对象flag = true;Intent intent = new Intent(myself, MainActivity.class);intent.putExtra("banknumber", getObject.getBank_number());intent.putExtra("bankname", getObject.getBank_name());intent.putExtra("bankcode", getObject.getBank_code());intent.putExtra("list", bankUtil);intent.putExtra("flag", flag);setResult(RESULT_OK, intent);myself.finish();}});// 长按菜单显示listView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {public void onCreateContextMenu(ContextMenu conMenu, View view,ContextMenuInfo info) {conMenu.setHeaderTitle("历史银行卡");conMenu.add(0, 0, 0, "删除该卡");}});}// 长按菜单删除该银行卡public boolean onContextItemSelected(MenuItem aItem) {AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) aItem.getMenuInfo();switch (aItem.getItemId()) {case 0:bankUtil.list.remove(info.position);Toast.makeText(myself, "删除成功", Toast.LENGTH_SHORT).show();adapter.notifyDataSetChanged();// 通知更新return true;}return false;}@Overridepublic void finish() {if (!flag) {Intent intent = new Intent(myself, MainActivity.class);intent.putExtra("list", bankUtil);intent.putExtra("flag", flag);setResult(RESULT_OK, intent);}super.finish();}}
还有两个帮助用的类,一个是列表的适配器类,还有一个就是银行账号的空格控制类
public class BankRecordAdapter extends BaseAdapter {private List<GroupBankBean> list;private Context mContext;private int listItemLayout;public BankRecordAdapter(Context c, List data, int listItemLayout) {this.mContext = c;this.list = data;this.listItemLayout = listItemLayout;}public int getCount() {return list.size();}public Object getItem(int position) {return list.get(position);}public long getItemId(int position) {return position;}class ViewHolder {public ImageView imgsUrlView;public TextView bankNameView, bankNumberView, bankIdView;public LinearLayout bankRecordItem;}public String getCardMessage(String number, String name) {String re = "";int i;for (i = 0; i < number.length() / 4; i++) {re += number.substring(4 * i, 4 * (i + 1)) + " ";}re += number.substring(4 * i, number.length());return re + " " + name;}public View getView(int position, View convertView, ViewGroup parent) {GroupBankBean bean = list.get(position);ViewHolder vh;if (convertView == null) {convertView = View.inflate(mContext, listItemLayout, null);vh = new ViewHolder();vh.imgsUrlView = (ImageView) convertView.findViewById(R.id.iv_icon);vh.bankRecordItem = (LinearLayout) convertView.findViewById(R.id.bank_record_item);vh.bankNameView = (TextView) convertView.findViewById(R.id.card_name_bank);vh.bankNumberView = (TextView) convertView.findViewById(R.id.card_number_bank);vh.bankIdView = (TextView) convertView.findViewById(R.id.card_id_bank);convertView.setTag(vh);} else {vh = (ViewHolder) convertView.getTag();}vh.bankRecordItem.setBackgroundResource(R.color.races_bg_1);vh.bankNameView.setText(bean.getBank_name());vh.bankNumberView.setText(getCardMessage(bean.getBank_number(),bean.getUser_name()));vh.bankIdView.setText(bean.getId());return convertView;}}

//控制输入时按没四位空一格,删除时也是一样public class InputStringWatcher implements TextWatcher {int beforeTextLength = 0;int onTextLength = 0;boolean isChanged = false;int location = 0;// 记录光标的位置private char[] tempChar;private StringBuffer buffer = new StringBuffer();int konggeNumberB = 0;private EditText editTest;public InputStringWatcher(EditText editTest) {this.editTest = editTest;}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {// TODO Auto-generated method stubonTextLength = s.length();buffer.append(s.toString());if (onTextLength == beforeTextLength || onTextLength <= 3 || isChanged) {isChanged = false;return;}isChanged = true;}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count,int after) {// TODO Auto-generated method stubbeforeTextLength = s.length();if (buffer.length() > 0) {buffer.delete(0, buffer.length());}konggeNumberB = 0;for (int i = 0; i < s.length(); i++) {if (s.charAt(i) == ' ') {konggeNumberB++;}}}@Overridepublic void afterTextChanged(Editable s) {if (isChanged) {location = editTest.getSelectionEnd();int index = 0;while (index < buffer.length()) {if (buffer.charAt(index) == ' ') {buffer.deleteCharAt(index);} else {index++;}}index = 0;int konggeNumberC = 0;while (index < buffer.length()) {if ((index == 4 || index == 9 || index == 14 || index == 19)) {buffer.insert(index, ' ');konggeNumberC++;}index++;}if (konggeNumberC > konggeNumberB) {location += (konggeNumberC - konggeNumberB);}tempChar = new char[buffer.length()];buffer.getChars(0, buffer.length(), tempChar, 0);String str = buffer.toString();if (location > str.length()) {location = str.length();} else if (location < 0) {location = 0;}editTest.setText(str);Editable etable = editTest.getText();Selection.setSelection(etable, location);isChanged = false;}}}

开始进去的时候将数据中的第一条数据显示给主界面,点击银行卡号边上的箭头就可以进入下一个界面同时传递数据,同时输入账号的时候会自动的实现四个号码一空格,删除的时候也是直接跳过

进入子activity后以列表显示数据和更新数据

长按删除其中的一列数据,当删除了之后要达到不管怎么回到主Activity,都会更新主activity里面的数据

删除之后列表中的数据就减少了一

最后记录下自己的几点错误和改正方法吧!首先在自定义的数据类时,因为数据类也就是bean类没有实现Serializable接口所以老报错,而且错误提示的是list必须是Arraylist,但是我怎么找都找不出来,代码里边都是Arraylist,相当郁闷。之后到处查资料都不得结果,后来我一时兴起,觉得双管齐下,用bean实现Serializable,一不小心就成功了。

还有一个郁闷的地方就是怎么实现子界面销毁时无条件返回更新主界面的数据,这个最坑爹了,到处都找不到相关的资料,哎!睡了一晚上之后决定实现重新实现finish()方法,起初也是错误很多的,不过西里呼噜之后就搞定了,当然在finish()里边传数据还是很烦躁的,各位得小心呀!

最后附上代码连接,希望各位打赏下。点击打开链接

0 0
原创粉丝点击