2012-07-08 20 views
0

我用ListView編寫一個活動。現在我想知道,是否有可能簡化我的代碼(使其更短)。簡化我的ListView(使用Intent,setOnItemClick等)

一個例子是代碼塊

package de.bodprod.dkr; 

import java.util.ArrayList; 
import java.util.HashMap; 


import android.app.ListActivity; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.AdapterView.OnItemClickListener; 

public class MediMenue extends ListActivity { 
    ArrayList<HashMap<String, Object>> medi_menue_items; 
    LayoutInflater inflater; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.medi_menue); 
     ListView antidotListView = (ListView) findViewById(android.R.id.list); 
     inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);   


     medi_menue_items = new ArrayList<HashMap<String,Object>>(); 

     HashMap<String , Object> item = new HashMap<String, Object>(); 
     item.put("title", "Antidots"); 
     item.put("desc", "Toxine und die Gegenmittel"); 
     item.put("class_open", "MediAntidotList"); 
     medi_menue_items.add(item); 

     item = new HashMap<String, Object>(); 
     item.put("title", "Notfallmedikamente"); 
     item.put("desc", "Dosierungen, Gegenanzeigen u.v.m."); 
     item.put("class_open", "MediNotmediList"); 
     medi_menue_items.add(item); 

     ListView lv; 
     lv = (ListView) findViewById(android.R.id.list); 
     lv.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       Intent in = new Intent(); 
       String class_open = ((TextView) view.findViewById(R.id.class_open)).getText().toString(); 
       if(class_open.equals("MediAntidotList")){ 
        in = new Intent(getApplicationContext(), MediAntidotList.class); 
       }else if(class_open.equals("MediNotmediList")){ 
        in = new Intent(getApplicationContext(), MediNotmediList.class); 
       } 
       startActivity(in); 

      } 
     });  

     final CustomAdapter adapter = new CustomAdapter(this, R.layout.medi_menue, medi_menue_items); 
     antidotListView.setAdapter(adapter);    

    } 
    private class CustomAdapter extends ArrayAdapter<HashMap<String, Object>>{ 
     public CustomAdapter(Context context, int textViewResourceId, ArrayList<HashMap<String, Object>> Strings) { 
      super(context, textViewResourceId, Strings); 
     } 
     private class ViewHolder{ 
      TextView class_open, title, desc; 
     } 
     ViewHolder viewHolder; 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      if(convertView==null){   
       convertView=inflater.inflate(R.layout.medi_menue_item, null); 
       viewHolder=new ViewHolder(); 
       viewHolder.class_open=(TextView) convertView.findViewById(R.id.class_open); 
       viewHolder.title=(TextView) convertView.findViewById(R.id.medi_menue_name); 
       viewHolder.desc=(TextView) convertView.findViewById(R.id.medi_menue_desc); 
       convertView.setTag(viewHolder); 
      }else{ 
       viewHolder=(ViewHolder) convertView.getTag(); 
      } 
      viewHolder.class_open.setText(medi_menue_items.get(position).get("class_open").toString()); 
      viewHolder.title.setText(medi_menue_items.get(position).get("title").toString()); 
      viewHolder.desc.setText(medi_menue_items.get(position).get("desc").toString()); 
      return convertView; 
     } 
    } 
} 

例如下:在OnItemClickListener我從列表項的ID,而且比我如果和其他人使用。但是id與活動中的名稱相同,是否可以說新的Intent,它應該使用String class_open中的名稱打開類?事情是這樣的:

 String class_open = ((TextView) view.findViewById(R.id.class_open)).getText().toString(); 
     Intent in = new Intent(getApplicationContext(), <class_open>.class); 
     startActivity(in); 

回答

0

首先,因爲你正在使用ListActivity,你並不需要調用列表本身上setOnListItemClick處理器,單從ListActivity重寫此方法:

protected void onListItemClick(ListView l, View v, int position, long id); 

所以,你可以有這樣的:

protected void onListItemClick(ListView l, View v, int position, long id) { 
    Intent in = new Intent(); 
    String class_open = ((TextView)v.findViewById(R.id.class_open)).getText().toString(); 
    if(class_open.equals("MediAntidotList")){ 
       in = new Intent(getApplicationContext(), MediAntidotList.class); 
      }else if(class_open.equals("MediNotmediList")){ 
       in = new Intent(getApplicationContext(), MediNotmediList.class); 
      } 
    startActivity(in); 

} 

然後回答您的其他問題,您可以嘗試Java反射獲取類:

String class_open = ((TextView)view.findViewById(R.id.class_open)).getText().toString(); 
Class c = Class.forName("com.yourpackagename." + class_open); 
Intent in = new Intent(getApplicationContext(), c); 
0

因爲我沒有嘗試過這個,所以我打算在這裏做一個長鏡頭。但是我看到你有一個你不顯示的ViewHolder類。如果你真的想改變你的onItemClick代碼,你可以將一個意圖存儲在你的getView(...)中設置的每個ViewHolder中。通過這種方式,您可以在onItemClick中獲取viewholder標籤,並從該標籤獲取意圖並啓動它。

例子:

public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
{ 
    // Get the intent that u stored in this viewholder 
    ViewHolder clicked = (ViewHolder)view.getTag(); 
    Intent toStart = clicked.getIntent(); 
    startActivity(toStart);   
} 

而且你不需要設置,因爲你是從ListActivity延長onItemClick監聽器,只需將其覆蓋。

要實現所有這些,您需要在適配器中對getView()進行一些更改。我相信你可以弄清楚什麼!