HappyIdiom之六(2)点击动物类列表中的每一项以对话框的形式显示该成语的详细信息

来源:互联网 发布:淘宝怎么申请子账号 编辑:程序博客网 时间:2024/04/30 13:12

目标:点击动物类列表中的每一项以对话框的形式显示该成语的详细信息

Step1:自定义弹出对话框的布局showview.xml文件

<?xml version="1.0" encoding="utf-8"?><!-- 关于页面的xml文件 --><ScrollView xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:scrollbars="vertical" >    <LinearLayout        android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:background="@drawable/bg_ling"        android:orientation="vertical" >        <TextView            android:id="@+id/show_idiom"            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:singleLine="false"            android:textColor="#000000"            android:textSize="20sp" />    </LinearLayout></ScrollView>

Step2:修改Study_AnimalActivity.java

public class Study_AnimalActivity extends ListActivity {private List<Map<String, Object>> data;private List<Idiom> idioms;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_study__animal);getData();SimpleAdapter simpleAdapter = new SimpleAdapter(this, data,R.layout.study_animal_item, new String[] { "idiom" },new int[] { R.id.idiom }) {// 重了基类的getView()方法,将每一项的按钮组件和对应的事件进行绑定@Overridepublic View getView(final int position, View convertView,ViewGroup parent) {View view = super.getView(position, convertView, parent);final ImageButton imageButton = (ImageButton) view.findViewById(R.id.save);imageButton.setFocusable(false);//这两句是关键imageButton.setFocusableInTouchMode(false);//这两句是关键imageButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(Study_AnimalActivity.this, "收藏喽!",Toast.LENGTH_LONG).show();}});return view;}};setListAdapter(simpleAdapter);       }// 当点击列表项的话弹出对话框,不知道为何列表项中出现按钮元素时,此方法就不起作用了?@Overrideprotected void onListItemClick(ListView l, View v, int position, long id) {super.onListItemClick(l, v, position, id);Idiom idiom = idioms.get(position);String result = idiom.getIdiom() + "\n" + idiom.getSpell() + "\n【解释】: "+ idiom.getExplain() + "\n【近义词】: " + idiom.getHomoionym()+ "\n【反义词】: " + idiom.getAntonym() + "\n【来源】: "+ idiom.getDerivation() + "\n【示例】: " + idiom.getExamples()+ "\n【英语翻译】: " + idiom.getEnglish();showDialog(result);}private void showDialog(String result) {AlertDialog.Builder builder = new AlertDialog.Builder(this);LayoutInflater layoutInflater = LayoutInflater.from(this);View view = layoutInflater.inflate(R.layout.showidiom, null);builder.setView(view);TextView textView = (TextView) view.findViewById(R.id.show_idiom);textView.setText(result);builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}});builder.create().show();}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.activity_study__animal, menu);return true;}private void getData() {IdiomDao idiomDao = new AnimalDao(this);idioms = idiomDao.getIdioms();data = new ArrayList<Map<String, Object>>();for (int i = 0; i < idioms.size(); i++) {Map<String, Object> map = new HashMap<String, Object>();map.put("idiom", idioms.get(i).getIdiom());data.add(map);}}}

Step3:运行测试

Tip:这部分在测试时总是达不到想要的效果,点击每个成语并不弹出对话框,通过google搜索发现是因为在列表项中如果出现按钮能够获取焦点的组件时,就会出现无法单击每一列表项的情况。

解决办法:使imageButton不能够获得焦点

imageButton.setFocusable(false);

imageButton.setFocusableInTouchMode(false);//这两句是关键

分析:

由于除了动物类,其他类的成语当打开点击每一项后都要弹出对话框,而这个对话框的效果是统一的,所以我们单独将showDialog方法封装到common包的DetailDialog类里。

 


 

 

原创粉丝点击