春节期间,放假回家,也就没有在继续弄这个,年后回来了继续研究!这里给大家拜个晚年了!
闲话少说,进入正题。
1、界面改动:
之前我们实现了在主界面动态查询、创建标签,这个标签直接就是可编辑的文本域。现在想改成MIUI便签那样,刚进入的时候是一个缩略图一样,点击进入看详细信息。
2、技术改动:
之前我们查询出来的便签是自己根据序号、高度定位的,现在改成用gridview+adapter显示。
(以下内容纯属本人自己在做的过程中琢磨实现,如有不妥或者不当的地方,欢迎指正!)
=====================================分割线=======================================
- 增加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。
到目前为止,我们最初想实现的功能就都实现了。
=================================================================================
写的可能比较乱,如果有疑问或者有需要改正不足之处,欢迎大家指正!源代码已上传到附件!