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;
}
4

3 に答える 3

2

I don't have a compiler right now, but you can try this.

I think it works but let me know if it don't.

    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); 
            }

        });
于 2012-03-20T04:02:02.573 に答える
2
findViewById 

は非常にコストのかかる呼び出しであり、できるだけ避ける必要があります。幸いなことに、次のViewHolderように使用できる a の考え方があります。

ViewHolder という内部クラスを作成する

private class ViewHolder {
  TextView link;
}

次に、getView内で、

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

その後は、TextViewlink変数の代わりにホルダー アイテムを使用するだけです。それで

viewHolder.link.setOnClickListener...

また、何百もの異なるアクティビティを作成する代わりに、それを起動するインテントから受け取った情報に応じて自分自身を調整できる、より柔軟なアクティビティをコーディングできます。例:

onClickListener内で、

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

受信アクティビティで位置を取得するには、次のようにします。

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

その情報に取り組み、さまざまなアクティビティで達成しようとしていることを表示します。

さらに質問がある場合は、コメントでお気軽にお問い合わせください。

(更新: このページの文字列配列の例) アイテムごとに 1 つの文字列だけではなく、strings.xml で文字列配列を使用できます: 水星 金星 地球 火星

それを使用するために、

Resources res = getResources();
String[] planets = res.getStringArray(R.array.planets_array);
于 2012-03-20T03:44:08.437 に答える
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); 

リフレクションを使用することもできます。その場合、実際に位置とアクティビティのマッピングをファイルに保持し、起動時にロードすることができます。

于 2012-03-20T03:14:07.903 に答える