经过前面的设计,我们已经完成了Animal实体类及AnimalDao数据访问类的创建,接下来我们要做的事情是将数据库中所有的动物类成语显示在界面上。
在layout下新建activity_animal.xml文件,主要添加了一个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="match_parent"
android:background="@drawable/bg_animal"
android:orientation="vertical" >
<ListView
android:id="@+id/lvAnimalList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layoutAnimation="@anim/anim_layout_listview"
android:listSelector="#00000000">
</ListView>
</LinearLayout>
然后需要为ListView的子项指定一个我们自定义的布局,在layout目录下新建animal_item.xml,代码如下所示:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp">
<TextView
android:id="@+id/tvName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:gravity="center"
android:text="助人为乐"
android:textAppearance="?android:attr/textAppearanceLarge"/>
<ImageButton
android:id="@+id/btnSave"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@null"
android:layout_alignParentRight="true"
android:layout_alignTop="@+id/tvName"
android:src="@drawable/btnsave"/>
</RelativeLayout>
在这个布局中,我们定义了一个TextView用于显示成语的名称,有定义了一个ImageButton用于显示收藏按钮。
接下来需要在应用的包下创建adapter包,在该包下创建一个自定义的适配器,这个适配器继承自ArrayAdapter,并将泛型指定为Animal类。新建类AnimalAdapter,代码如下所示:
package cn.edu.bztc.happyidiom.adapter;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.TextView;
import cn.edu.bztc.happyidiom.R;
import cn.edu.bztc.happyidiom.entity.Animal;
public class AnimalAdapter extends ArrayAdapter<Animal> {
private int resourceId;
public AnimalAdapter(Context context, int resource, List<Animal> objects) {
super(context, resource, objects);
resourceId = resource;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Animal animal = getItem(position);// 获取当前项的Animal实例
View view;
ViewHolder viewHolder;
if (convertView == null) {
view = LayoutInflater.from(getContext()).inflate(resourceId, null);
viewHolder = new ViewHolder();
viewHolder.tvName = (TextView) view.findViewById(R.id.tvName);
viewHolder.btnSave = (ImageButton) view.findViewById(R.id.btnSave);
view.setTag(viewHolder);// 将ViewHolder存储在View中
} else {
view = convertView;
viewHolder = (ViewHolder) view.getTag();// 重新获取ViewHolder
}
viewHolder.tvName.setText(animal.getName());
return view;
}
class ViewHolder {
TextView tvName;
ImageButton btnSave;
}
}
AnimalAdapter的实现过程与CategoryAdapter的实现非常类似,这里不再赘述。
下面在activity包下新建StudyAnimalActivity继承自Activity,代码如下所示:
package cn.edu.bztc.happyidiom.activity;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import cn.edu.bztc.happyidiom.R;
import cn.edu.bztc.happyidiom.adapter.AnimalAdapter;
import cn.edu.bztc.happyidiom.dao.AnimalDao;
import cn.edu.bztc.happyidiom.entity.Animal;
public class StudyAnimalActivity extends Activity {
private List<Animal> animalList;
private AnimalDao animalDao;
private ListView lvAnimalList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_animal);
initAnimals();
lvAnimalList = (ListView) findViewById(R.id.lvAnimalList);
AnimalAdapter animalAdapter = new AnimalAdapter(this,
R.layout.animal_item, animalList);
lvAnimalList.setAdapter(animalAdapter);
}
private void initAnimals() {
// TODO Auto-generated method stub
animalDao = AnimalDao.getInstance(this);
animalList = animalDao.getAllAnimals();
}
}
可以看出,这里添加了一个initAnimals()方法,用于初始化所有的动物数据。然后获取ListView控件,建立AnimalAdapter关联子布局及数据,调用ListView控件的setAdapter()方法与关联数据,这样定制ListView界面的任务就完成了。
接下来需要修改StudyActivity中的点击事件。
public class StudyActivity extends Activity {
private List<Category> categoryList;
private String[] category_names;
private int[] category_images;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_study);
initCategories();// 初始化类别
CategoryAdapter adapter = new CategoryAdapter(this,
R.layout.category_item, categoryList);
ListView listView = (ListView) findViewById(R.id.lvCategories);
listView.setAdapter(adapter);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view,
int position, long id) {
switch (position) {
case 0:
Intent intent = new Intent(StudyActivity.this,
StudyAnimalActivity.class);
startActivity(intent);
break;
default:
break;
}
}
});
}
在运行程序之前,首先修改AnimalManifest.xml文件将StudyActivity变为入口类,现在重新运行程序,效果如图所示。
package cn.edu.bztc.happyidiom.adapter;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import cn.edu.bztc.happyidiom.R;
import cn.edu.bztc.happyidiom.entity.Animal;
public class AnimalAdapter extends ArrayAdapter<Animal> {
private int resourceId;
private Context context;
public AnimalAdapter(Context context, int resource, List<Animal> objects) {
super(context, resource, objects);
this.context = context;
resourceId = resource;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final Animal animal = getItem(position);// 获取当前项的Animal实例
View view;
ViewHolder viewHolder;
if (convertView == null) {
view = LayoutInflater.from(getContext()).inflate(resourceId, null);
viewHolder = new ViewHolder();
viewHolder.tvName = (TextView) view.findViewById(R.id.tvName);
viewHolder.btnSave = (ImageButton) view.findViewById(R.id.btnSave);
viewHolder.btnSave.setFocusable(false);
viewHolder.btnSave.setFocusableInTouchMode(false);
viewHolder.btnSave.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(context, "你要收藏" + animal.getName() + "吗",
Toast.LENGTH_LONG).show();
}
});
view.setTag(viewHolder);// 将ViewHolder存储在View中
} else {
view = convertView;
viewHolder = (ViewHolder) view.getTag();// 重新获取ViewHolder
}
viewHolder.tvName.setText(animal.getName());
return view;
}
class ViewHolder {
TextView tvName;
ImageButton btnSave;
}
}
修改后重新运行程序,如图所示。
点击一下收藏按钮,就会显示是否收藏当前的成语,这样我们第四阶段的开发任务也完成了。