Лучшая практика, когда дело доходит до создания намерений - PullRequest
2 голосов
/ 20 марта 2012

У меня есть собственный список, который отображает ок.114 элементов, и в нем у меня есть TextView (использовать в качестве ссылки), поэтому, когда пользователь нажимает на ссылку, он принимает к другому виду деятельности что-то вроде «читать дальше ...», своего рода ссылку в просмотре списка.

мой вопрос: оптимизирован ли приведенный ниже код?другими словами, следуя лучшим практикам?или ужасно?так как я буду создавать около 114 activities, layouts и добавлять в 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 ]

2 голосов
/ 20 марта 2012
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);

и работайте с этой информацией, чтобы показать, что вы пытаетесь выполнить с помощью различных действий.

Если у вас есть еще вопросы, не стесняйтесь спрашивать в комментариях.

(обновление: пример массива строк, с этой страницы ) в вашем strings.xml вместо одной строки на элемент вы можете иметь массив строк: Меркурий Венера земной шар Марс

чтобы использовать его,

Resources res = getResources();
String[] planets = res.getStringArray(R.array.planets_array);
2 голосов
/ 20 марта 2012

У меня сейчас нет компилятора, но вы можете попробовать это.

Я думаю, что он работает, но дайте мне знать, если его нет.

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

        });
2 голосов
/ 20 марта 2012

Извините, но действительно ужасно.Что вы можете сделать, это сохранить 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); 

Вы также можете использовать отражение, а еслиесли вы сделаете это, то сможете фактически сохранить в файле положение для отображения активности и загрузить его при запуске.

...