2012-03-20 13 views
2

私はカスタムリストビューを持っています。 114個のアイテムがあり、その中にTextView(リンクとして使用)があるので、ユーザーがリンクをクリックすると、「もっと読む...」のような別のアクティビティに移動します。インテントの作成に関するベストプラクティス

私の質問:以下のコードは最適化されていますか?言い換えればベストプラクティスに従っていますか?恐ろしいですか?私は114 activitieslayouts周りを作成して申し訳ありませんAndroidManifest.xml

public View getView(int position, View convertView, ViewGroup parent) { 
    View vi=convertView; 
    if(convertView==null) 
     vi = inflater.inflate(R.layout.list_row_custom_listview, null); 

    final TextView artist = (TextView)vi.findViewById(R.id.artist); 
    TextView link = (TextView)vi.findViewById(R.id.txtLink); 

    link.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 

    if (position == 0) { 
     Intent intent_01 = new Intent(v.getContext(), more_01_Activity.class);  
     v.getContext().startActivity(intent_01); 
    } 
    if (position == 1) { 
     Intent intent_02 = new Intent(v.getContext(), more_02_Activity.class);  
     v.getContext().startActivity(intent_02); 
    } 
    if (position == 3) { 
     Intent intent_03 = new Intent(v.getContext(), more_03_Activity.class);  
     v.getContext().startActivity(intent_03); 
    } 
     ........... 
     ............ 
     ........... 
     //goes upto 114 

     } 
    }); 
    return vi; 
} 
+1

私は、インテントが関与しているかどうかにかかわらず、非常に怖い、良くないと述べています。最初に、more_01_Activity、more_02_Activityなどはどれほど類似していますか?ポジションなどの引数を渡すことができれば、それらは同じであろうか? – Izkata

+0

だから 'more_01_activity/02/03 ....'私はテキストを表示するので、あなたの質問への答えは全く異なる。 –

+1

テキストだけが異なる場合は、テキストのstringIdを渡して、1つのアクティビティを表示できます。 – superfell

答えて

2
findViewById 

は幸いにも、あなたがこのように使用することができますViewHolder、このアイデアはあります、可能な限り避けるべきで非常に高価な呼び出しです:

ViewHolder

private class ViewHolder { 
    TextView link; 
} 
と呼ばれる内部クラスを作成しますTHA後

その後、あなたのgetViewメソッドの内部、

ViewHolder viewHolder; 
if(convertView==null) { 
    convertView = inflater.inflate... 
    viewHolder = new ViewHolder(); 
    viewHolder.link = convertView.findViewById... 
    convertView.setTag(viewHolder); 
} else { 
    viewHolder = (ViewHolder)convertView.getTag(); 
} 

これは、TextView link変数の代わりにホルダー項目を使用するだけの問題です。 はそう

viewHolder.link.setOnClickListener... 

また、代わりに様々な活動の数百を作成する、あなたはそれを起動する意図から受け取った情報に応じて、自分自身を調整することができ、より柔軟な活動をコーディングすることができます。例:onClickListener内部

Intent i = new Intent(context, MyFlexibleActivity.class); 
    i.putExtra("position", position); 
    startActivity(i); 

、受信アクティビティでの位置を取得

int position = getIntent().getIntExtra("position", default_value); 

を行うと、あなたは別の活動を達成しようとしているものを表示するには、その情報に動作するように。

ご不明な点がございましたら、お気軽にコメントしてください。

(更新:文字列配列の例、このpageから) あなたの文字列に。私が持っていない は水星 金星 地球 火星

はそれを使用するには、

Resources res = getResources(); 
String[] planets = res.getStringArray(R.array.planets_array); 
+0

Josephus、最後の質問(うまくいけば) 'MyFlexibleActivity'で私は' if条件 'を持っていなければならないと仮定しています。表示するテキストと1つのアクティビティを持つstringId?または私はまったく間違っていると思っているかもしれません、またはあなたは 'MyFlexibleActivity'実装のいくつかの行を投稿できますか? –

+0

MyFlexibleActivityはどのように見えますか?リスト?ただの文字列ですか?それが文字列の場合は、インテントから取得した位置を使用して項目を照会できる静的な文字列配列(たとえば、主なアクティビティなど)を使用できます。 – josephus

+0

私の質問が更新されました。どうぞご覧ください。 –

2

に追加されますので、と言うが、確かにそれは恐ろしいですします。できることは配列またはハッシュマップまたはファイルにmore_01_Activity.classを格納することです。

SOLN:あなたはまた、リフレクションを使用することができますし、あなたがそうするならば、あなたが実際にファイルに活動へのマッピング位置を持続し、起動時にそれをロードすることができ、アレイ

static Class[] activityList = { more_01_Activity.class, more_02_Activity.class }; 

Intent intent_03 = new Intent(v.getContext(), activityList[position]);  
v.getContext().startActivity(intent_03); 

を使用します。

2

:XML、代わりに項目ごとに1つの文字列で、あなたは文字列配列を持つことができます今コンパイラを使用していますが、これを試すことができます。

私はそれが動作すると思うが、私に知らせてくれません。

private List<Class> listOfActivityClass; // Add all your Activity.class into this list 

    ...... 

     link.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 

      Intent intent; 
      intent = new Intent(v.getContext(), listOfActivityClass.get(position); 

      if(intent != null) { 
       v.getContext().startActivity(intent); 
      } 

     }); 
関連する問題