android学习笔记(3、便签demo改进)

android学习笔记(三、便签demo改进)

春节期间,放假回家,也就没有在继续弄这个,年后回来了继续研究!这里给大家拜个晚年了!android学习笔记(3、便签demo改进)

闲话少说,进入正题。

1、界面改动:

之前我们实现了在主界面动态查询、创建标签,这个标签直接就是可编辑的文本域。现在想改成MIUI便签那样,刚进入的时候是一个缩略图一样,点击进入看详细信息。


android学习笔记(3、便签demo改进)android学习笔记(3、便签demo改进)
 

2、技术改动:

之前我们查询出来的便签是自己根据序号、高度定位的,现在改成用gridview+adapter显示。

(以下内容纯属本人自己在做的过程中琢磨实现,如有不妥或者不当的地方,欢迎指正!)

=====================================分割线=======================================

  1. 增加adapter(adapter适配器的作用主要是用来给诸如(Spinner、ListView、GridView)来填充数据的),显示缩略便签。这里在主页显示所用的控件不再是 EditText,而是TextView。首先创建自己的adapter,这个类要继承BaseAdapter父类,然后会让你实现一系列方法。
package com.example.txtlabel.adapter;

import java.util.List;
import com.example.txtlabel.R;
import com.google.common.base.Strings;

import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.TextView;

public class LabelAdapter extends BaseAdapter {

	private List<EditText> txtList;
	private LayoutInflater inflater;
	
	public LabelAdapter(Context context,List<EditText> txtList) {
		super();
		this.txtList = txtList;
		inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}
	
	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return txtList.size();
	}

	@Override
	public EditText getItem(int position) {
		// TODO Auto-generated method stub
		return txtList.get(position);
	}

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

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		convertView = inflater.inflate(R.layout.txt, null);
		TextView contentView = (TextView) convertView.findViewById(R.id.textView1);
//		contentView.setBackgroundColor(Color.parseColor("#FFDAB9"));
		String content = getItem(position).getText().toString();
		
		if(Strings.isNullOrEmpty(content))
			contentView.setText("无内容");
		else
			contentView.setText(content);
		return convertView;
	}

}

 这里要说一下 这句

convertView = inflater.inflate(R.layout.txt, null);

 LayoutInflater 是用来动态载入一个页面的(已经载入的可以用findViewById查找)。里面的R.layout.txt是我新建立的一个页面/xml,代码如下:

 

<?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="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="126dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.31"
        android:background="@drawable/background_1"
        android:text="TextView" />

</LinearLayout>

 它就是要在主页面中grid里显示的东西,gridview就像html里的frame一样,在嵌套另外一个页面,用来显示。

adapter建立好了之后,在主类里把adapter和gridview关联起来。

gridView = (GridView) findViewById(R.id.grid_txt);
gridView.setBackgroundColor(Color.GRAY);
labelAdapter = new LabelAdapter(this, txtList);
gridView.setAdapter(labelAdapter);

 到此为止,我们在启动项目的时候,主页面显示的就不在是可编辑的文本域了,而是缩略形式的textview,并且显示很规范。

 

  2.现在要做的是单击textview,进入详细页面。

 最开始我是想在创建TextView的时候(adapter里)直接加入单击的listener,单机后跳转页面。但是发现跳转页面需要Intent类,然后进行startActivity(intent),这个方法只在Activity的子类里有,adapter里没有这个方法!!无奈只能想别的办法。后来发现gridview里有个setOnItemClickListener事件,就是说为它的每一个子元素(item)添加click事件。看代码:

gridView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int position,
					long id) {
				Log.i("info", "position:"+position+"----id:"+id);
				
				Intent intent = new Intent(MainActivity.this,LabelActivity.class);
				EditText editText = txtList.get(position);
				//传递参数到下一个页面
				intent.putExtra("content", editText.getText().toString());
				intent.putExtra("id", editText.getId());
				startActivity(intent);
			}
		});

 这里面intent传参数就不说了,很简单,像map一样,new Intent里的LabelActivity 是新创建的一个类,对应点击后进入的新页面label_content.xml。

<?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="match_parent"
    android:orientation="vertical" >

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:ems="10" >

        <requestFocus />
    </EditText>

</LinearLayout>

 

 

注:在建立完xml和LabelActivity类之后,要在AndroidManifest.xml里注册你的LabelActivity,

 <activity android:name="com.example.txtlabel.activity.LabelActivity"/>

 否则会报

 

android.content.ActivityNotFoundException: Unable to find explicit activity class {com.example.txtlabel/com.example.txtlabel.activity.LabelActivity}; have you declared this activity in your AndroidManifest.xml?异常。

现在为止,点击textview应该就可以跳转到详细页面了。

  3.编辑完数据,保存。

编辑数据-保存这个很简单,之前我们已经做过了,但是现在有一个问题就是返回到列表主页面的时候,显示的数据信息还是你未修改前的数据!对,数据没有刷新!

我的思路就是 详细页面修改完保存数据,到主页面的时候在更新一下(废话,当然是这样了),但是这里遇到个问题,什么时候保存,什么时候更新?详细页面里我先后试了在onDestroy和onWindowFocusChanged的时候进行保存数据,主页面在onResume、onWindowFocusChanged、onRestart的时候进行更新。但是都失败了。。。因为主页面的onResume、onWindowFocusChanged、onRestart都会在编辑页面的onDestroy和onWindowFocusChanged之前执行。所以即使你更新,更新到的仍然是未保存以前的数据。最后没办法,只能在修改页面里监听onBackPressed事件,然后在主页面里监听onRestart事件(不能监听onResume,因为onResume事件会在程序启动的时候也执行一遍)。

注:监听onBackPressed事件的时候AndroidManifest.xml里的minSdkVersion不能小于5。

 到目前为止,我们最初想实现的功能就都实现了。

=================================================================================

写的可能比较乱,如果有疑问或者有需要改正不足之处,欢迎大家指正!源代码已上传到附件!