Отдельный слушатель событий для каждого текстового просмотра в Android - PullRequest
2 голосов
/ 10 октября 2010

Я хочу добавить отдельного слушателя событий в динамически создаваемый список просмотра текста. Код пока такой:

while (cur.moveToNext()){
    TextView tv = new TextView(this);
    temp = cur.getString(cur.getColumnIndexOrThrow("_ID"));
    result = "some text";
    tv.setText(result);
    tv.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent myIntent = new Intent(v.getContext(), newsDetails.class);
                myIntent.putExtra("id", temp);
                startActivity(myIntent);
            }
        });
    lOut.addView(tv);
}

Но это не работает. Отдельные текстовые представления создаются в виде списка, но отдельные прослушиватели событий не работают.

Ответы [ 2 ]

2 голосов
/ 10 октября 2010

Предполагая, что это фактический код, а не псевдокод, я согласен с Аароном в том, что использование полей-членов является вероятным источником вашей проблемы. Однако я не согласен с решением: вы не должны использовать поля. (Если вам нужно назвать свое поле «temp», это довольно хороший намек на то, что оно должно быть локальным.) Если вы создаете «конечную» локальную переменную, то вы знаете, что она не изменится из-под вас, и это фиксированное значение будет заблокировано в вашем анонимном подклассе (то есть слушателе).

Код становится следующим:

while (cur.moveToNext()){
    TextView tv = new TextView(this);
    final String temp = cur.getString(cur.getColumnIndexOrThrow("_ID"));
    final String result = "some text";
    tv.setText(result);
    tv.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent myIntent = new Intent(v.getContext(), newsDetails.class);
                myIntent.putExtra("id", temp);
                startActivity(myIntent);
            }
        });
    lOut.addView(tv);
}

Вы, конечно, захотите избавиться от полей с именами "temp" и "result", так как их место занимают локальные переменные.

0 голосов
/ 10 октября 2010

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

От верхаНа мой взгляд, самое простое решение, которое я могу придумать, - это сохранить объект temp в качестве тега TextView, а затем извлечь его в функции onClick().

while (cur.moveToNext()){
        TextView tv = new TextView(this);
        temp = cur.getString(cur.getColumnIndexOrThrow("_ID"));
        result = "some text";
        tv.setText(result);
        tv.setTag(temp);
        tv.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    Intent myIntent = new Intent(v.getContext(), newsDetails.class);
                    myIntent.putExtra("id", v.getTag());
                    startActivity(myIntent);
                }
            });
        lOut.addView(tv);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...