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

很抱歉地说,但确实很可怕。您可以做的是存储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 回答
2
findViewById 

是一个非常昂贵的调用,应该尽可能避免,幸运的是有这个想法 a 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();
}

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

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

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

(更新:字符串数组示例,来自此页面)在您的 strings.xml 上,而不是每个项目只有一个字符串,您可以有一个字符串数组:Mercury Venus Earth Mars

使用它,

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

        });
于 2012-03-20T04:02:02.573 回答