Как избежать установки встроенного onClickListner в getView () - PullRequest
2 голосов
/ 09 августа 2010

Меня попросили провести рефакторинг кода getView(), представленного ниже.

У меня есть ListView с пользовательским адаптером. Каждая строка содержит кнопки и тексты, которые можно нажимать.

На данный момент onClickListeners установлены в теле getView(), это довольно безумная идея, потому что этот метод вызывается очень часто. Внутри каждой функции onClick мне нужен доступ к личным данным для вызова новой активности с помощью bundle.

Как я могу переместить определение onClick за пределы процедуры getView ()?

Когда будет вызываться onClick, мне нужна информация о положении элемента списка (для доступа к личным данным) и о том, какой вид был нажат (чтобы начать корректную активность).

public View getView(int position, View convertView, ViewGroup parent) {
    if(convertview == null) {
        convertView = ((Activity) getContext()).getLayoutInflater().inflate(R.layout.photo_tweet_row, null);
    }

    TextView userTweet = (TextView) v.findViewById(R.id.feed_user_tweet_body);
    RepliesButton repliesBtn = (RepliesButton) v.findViewById(R.id.feed_replies_button);

    Status twitterDataItem = getItem(position);

    if (twitterDataItem != null) {

        if (userTweet != null) {
            userTweet.setText(twitterDataItem.getText());
        }
        if (repliesBtn != null) {
            repliesBtn.setText(" replies");
        }

        userTweet.setOnClickListener(new View.OnClickListener() {           
            @Override
            public void onClick(View v) {                    
              Intent intent = new Intent(getContext(), ProfileActivity.class); 
              intent.putExtra(getContext().getString(R.string.serializable_user), twitterDataItem.getUser());
              getContext().startActivity(intent);
            }
        });

        repliesBtn.setOnClickListener(new View.OnClickListener() {

            public void onClick(View view) {
                if (!twitterDataItem.getComments().contentEquals("0")) {
                    Intent myIntent = new Intent(getContext(), RepliesToFeedActivity.class);
                    myIntent.putExtra("photoTweet", twitterDataItem);
                    getContext().startActivity(myIntent);
                }
            }
        });
    }
    return convertView;
}

Ответы [ 2 ]

3 голосов
/ 09 августа 2010

Ваша деятельность должна реализовывать OnClickListener и перемещать реализованный метод до уровня активности.

На основе параметра view метода, который вы можете определить, из какого объекта пользовательского интерфейса произошло событие (кнопка, просмотр текста).

Что касается того, как определить, для какой записи / строки в просмотре списка. Вы должны установить пользовательский tag для кнопок и текстовых представлений в методе getView, который вы будете читать в событии через getTag, этот тег также может быть пользовательским объектом, если строки недостаточно. Вероятно / рекомендуемый путь - это позиция в адаптере.

1 голос
/ 09 февраля 2011

Боюсь, что ответ Pentium10 не верный.Если этот флажок должен быть активным и активным независимо от самого элемента списка (скажем, он определен в макете XML элемента списка), он будет перехватывать событие нажатия, и элемент списка (OnItemClickListener списка) не получитнажмите на все.Поэтому вы должны реализовать onClickListener в самом адаптере - либо в getView (), либо иметь адаптер, реализующий onClickListener - в этом случае элементы должны быть помечены, чтобы слушатель знал, над каким элементом он работает.

...