Android: Как использовать методы ViewTag, getTag и findViewWithTag?

У меня возникли проблемы с разделом кода для моего приложения для Android. Я продолжаю получать NullPointerException при попытке установить фон объекта ImageView.

Здесь код:

public View getView(int position, View view, ViewGroup parent) {
    ImageView imageView;
    if (view == null) {
        imageView = new ImageView(mContext);
    } else {
        imageView = (ImageView) view;
    }
    imageView.setTag(position);
    return imageView;
}

private OnItemClickListener itemClickListener = new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {

        ImageView imageView;
        //Variable i, here, is from a for loop.
        imageView = (ImageView)v.findViewWithTag(i);
        //I get a NullPointerException at the next line, "Log.d"
        Log.d("View 1", imageView.toString());
        //If I get rid of the "Log.d" line above, 
        //the NullPointerException occurs on the next line
        imageView.setBackgroundColor(Color.BLUE);
        imageView = (ImageView)v.findViewWithTag(position);

        Log.d("View 2", imageView.toString());
        imageView.setBackgroundColor(Color.BLUE);

    };
}

Я подозреваю, что проблема с моим кодом связана с тем, какой параметр я передаю методу setTag(), и каким параметром я передаю метод findViewWithTag(). Если бы кто-нибудь мог показать мне пример того, как устанавливать теги и находить представления с тегами, я был бы очень признателен.

Спасибо за ваше время.

Изменить: Здесь журнал ошибок. Я не уверен, куда его поместить, поэтому я поставлю его здесь.

05-04 21:47:24.314: ERROR/AndroidRuntime(335): FATAL EXCEPTION: main
05-04 21:47:24.314: ERROR/AndroidRuntime(335): java.lang.NullPointerException
05-04 21:47:24.314: ERROR/AndroidRuntime(335):     at com.jacksmartie.PhotoMem.MainActivity$1.onItemClick(MainActivity.java:79)
05-04 21:47:24.314: ERROR/AndroidRuntime(335):     at android.widget.AdapterView.performItemClick(AdapterView.java:284)
05-04 21:47:24.314: ERROR/AndroidRuntime(335):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:1696)
05-04 21:47:24.314: ERROR/AndroidRuntime(335):     at android.os.Handler.handleCallback(Handler.java:587)
05-04 21:47:24.314: ERROR/AndroidRuntime(335):     at android.os.Handler.dispatchMessage(Handler.java:92)
05-04 21:47:24.314: ERROR/AndroidRuntime(335):     at android.os.Looper.loop(Looper.java:123)
05-04 21:47:24.314: ERROR/AndroidRuntime(335):     at android.app.ActivityThread.main(ActivityThread.java:4627)
05-04 21:47:24.314: ERROR/AndroidRuntime(335):     at java.lang.reflect.Method.invokeNative(Native Method)
05-04 21:47:24.314: ERROR/AndroidRuntime(335):     at java.lang.reflect.Method.invoke(Method.java:521)
05-04 21:47:24.314: ERROR/AndroidRuntime(335):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-04 21:47:24.314: ERROR/AndroidRuntime(335):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-04 21:47:24.314: ERROR/AndroidRuntime(335):     at dalvik.system.NativeStart.main(Native Method)`

Ответ 1

Эта строка является частью вашего виновника:

com.jacksmartie.PhotoMem.MainActivity$1.onItemClick(MainActivity.java:79)

Поместите здесь точку останова:

Log.d("View 1", imageView.toString());

И посмотрите, что такое ссылочный объект imageview [imageView], я ожидаю, что он является нулевым, потому что вы не связываете его правильно.

Если это значение равно null, это означает, что ваша ссылка на ссылочный вид неверна. Если это так, то вам нужно соответствующим образом назначить его следующим образом:

Button b = findViewById(R.id.Button01);

Тем не менее; так как вы используете то, что кажется ListView, потяжка этого немного отличается. Это означает, что то, как вы пытаетесь разобраться, ошибочно, сделайте некоторые исследования, должно найти что-то, что поможет вам это понять!

Ответ 2

Хорошо, вы не говорите, где он разбился. И это не ясно, что вы делаете.

public View getView(int position, View view, ViewGroup parent) {
    imageView.setTag(position);
    return imageView;

Где объявляется imageView? На что он установлен?

private OnItemClickListener itemClickListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {

                        ImageView imageView;
                        //Variable i, here, is from a for loop.
                        imageView = (ImageView)v.findViewWithTag(i);

Здесь вы объявляете вторую локальную переменную с именем imageView, но она исчезает при выходе из области. Если вы полагаетесь на это для установки предыдущей переменной imageView, у вас не будет радости. i из цикла for, но как это связано с position в методе getView()?

Ответ 3

нуль-указатель происходит потому, что переменная imageView имеет значение null, так как findviewbyid не нашел вид, поэтому вы должны сделать чек, если он равен нулю, Android Log терпит неудачу, поскольку он не может напечатать нулевую переменную вместо установки тега, попробуйте для установки идентификатора, выполнив

imageView.setId(положение);

Если я правильно понял, что вы не используете идентификатор в адаптере, и поскольку представление создано, оно по умолчанию не имеет его. тег в основном используется для размещения объекта, который необходим для представления его как вспомогательной переменной, поэтому используйте его визуально:)

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