创建意图的最佳实践

时间:2012-03-20 02:53:58

标签: android android-listview android-adapter

我有一个自定义列表视图,显示约。 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;
}

3 个答案:

答案 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); 

您也可以使用反射,如果您这样做,那么您实际上可以将位置保持在文件中的活动映射并在启动时加载它。

答案 1 :(得分:2)

findViewById 

是一个非常昂贵的电话,应该尽可能避免,幸运的是有一个ViewHolder的想法,你可以这样使用:

创建一个名为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();
}

之后,只需使用持有者项而不是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);

并处理该信息,以显示您尝试通过不同活动完成的任务。

如果您有更多问题,请随时在评论中提问。

(update:string array example,from this page) 在strings.xml上,而不是每个项目只有一个字符串,你可以有一个字符串数组:                                汞             金星             地球             火星              

使用它,

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

答案 2 :(得分:2)

我现在没有编译器,但你可以试试这个。

我认为它有效,但如果没有,请告诉我。

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

        });