CursorAdapter и кнопка - PullRequest
       2

CursorAdapter и кнопка

2 голосов
/ 04 декабря 2011

У меня есть база данных. Значения из базы данных отображаются в виде списка. Список имеет растровое изображение, 4 TextViews и 2 кнопки. Я написал два разных OnClickListeners для моих 2 кнопок, но оба метода не увенчались успехом. Когда я нажимаю на кнопки, программа зависает, когда она пытается выполнить «tvText1.setText (...)»

Кто-нибудь знает, как это исправить?

Кнопки в xml-файле выглядят так:

<Button android:id="@+id/buttonON" 
        android:gravity="center"
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content"
        android:layout_alignParentRight="true" 
        android:focusable="false"
        android:onClick="btnButtonONclicked"
        android:text="ON" />

<Button android:id="@+id/buttonOFF" 
        android:gravity="center"
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content"
        android:layout_alignParentRight="true" 
        android:focusable="false"
        android:text="OFF" />

Это мой CursorAdapter

public class ModuleCursorAdapter extends ResourceCursorAdapter implements OnClickListener {

    public ModuleCursorAdapter(Context context, Cursor cur) {
        super(context, R.layout.notes_row, cur);
    }

    @Override
    public View newView(Context context, Cursor cur, ViewGroup parent) {
        LayoutInflater li = LayoutInflater.from(context);
        return li.inflate(R.layout.notes_row, parent, false);
    }

    @Override
    public void bindView(View view, Context context, Cursor cur) {        
        TextView tvText1 = (TextView)view.findViewById(R.id.text1);
        TextView tvText2 = (TextView)view.findViewById(R.id.text2);
        TextView tvText3 = (TextView)view.findViewById(R.id.text3);
        TextView tvText4 = (TextView)view.findViewById(R.id.text4);
        ImageView ivIcon = (ImageView)view.findViewById(R.id.icon);
        Button btnButtonON = (Button)view.findViewById(R.id.buttonON);
        Button btnButtonOFF = (Button)view.findViewById(R.id.buttonOFF);

        tvText1.setText(cur.getString(cur.getColumnIndex(NotesDbAdapter.KEY_TITLE)));
        tvText2.setText(cur.getString(cur.getColumnIndex(NotesDbAdapter.KEY_DEVICETYPE)));
        tvText3.setText(cur.getString(cur.getColumnIndex(NotesDbAdapter.KEY_HOMECODE)));
        tvText4.setText(cur.getString(cur.getColumnIndex(NotesDbAdapter.KEY_DEVICECODE)));

        String filename = "modul_r_" + cur.getString(cur.getColumnIndex(NotesDbAdapter.KEY_DEVICETYPE));
        int id = context.getResources().getIdentifier(filename, "drawable", "com.module.main");     
        ivIcon.setImageBitmap(BitmapFactory.decodeResource(context.getResources(), id));            

        btnButtonON.setTag(id);

        btnButtonOFF.setTag(id);
        btnButtonOFF.setOnClickListener(btnButtonOFFclicked);
    }
    @Override
    public void onClick(View view) {

    }       

     public void btnButtonONclicked(View view) {
         TextView tvText1 = (TextView)view.findViewById(R.id.text1);
            tvText1.setText("On");
     }


    private OnClickListener btnButtonOFFclicked = new OnClickListener() {
        @Override
        public void onClick(View view) {
            TextView tvText1 = (TextView)view.findViewById(R.id.text1);
            tvText1.setText("Off");
        }
    };
}

Спасибо за вашу помощь.

Приветствия

Felix

Комментарий.

Весь файл макета

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:orientation="horizontal">

<ImageView
    android:id="@+id/icon"
    android:scaleType="centerCrop"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:paddingTop="10dp"
    android:src="@drawable/my_icon"/>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:orientation="vertical">



    <TextView android:id="@+id/text1"
        android:textSize="22dp"
        android:layout_width="170dp"
        android:layout_height="wrap_content"/>

    <LinearLayout 
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:orientation="horizontal">

        <TextView android:text="Code: " 
            android:textSize="15dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView android:id="@+id/text2"
            android:textSize="15dp"
            android:paddingLeft="12dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView android:id="@+id/text3" 
            android:textSize="15dp"
            android:paddingLeft="12dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView android:id="@+id/text4"
            android:textSize="15dp"
            android:paddingLeft="12dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>
</LinearLayout>

<Button android:id="@+id/buttonON" 
        android:gravity="center"
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content"
        android:layout_alignParentRight="true" 
        android:focusable="false"
        android:onClick="btnButtonONclicked"
        android:text="ON" />

<Button android:id="@+id/buttonOFF" 
        android:gravity="center"
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content"
        android:layout_alignParentRight="true" 
        android:focusable="false"
        android:text="OFF" />

Комментарий Комментарий:

Теперь я удалил tv.Text1.setText («Вкл»). Для кнопки включения есть еще исключение. Для кнопки выключения хорошо работает system.out.println ().

Это часть кода:

         public void btnButtonONclicked(View view) {
         //  Still an exeption thrown
     }


    private OnClickListener btnButtonOFFclicked = new OnClickListener() {
        @Override
        public void onClick(View view) {
            System.out.println("Hello. Here is the message.");
            //  working fine
        }
    };

Ответы [ 4 ]

2 голосов
/ 04 декабря 2011

Где находятся ваши TextViews? Или, может быть, лучше: вы можете показать нам весь файл макета?

Оба OnClickListeners передаются ссылкой View, но, как вы можете прочитать в документации , аргумент - это представление, по которому щелкнули, - другими словами: это будет ссылка на кнопки. Кнопки, безусловно, , а не содержат текстовые представления, которые вы ищете, следовательно,

TextView tvText1 = (TextView)view.findViewById(R.id.text1);

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

// Редактировать: некоторый код для иллюстрации того, что упоминается в комментариях ниже.

@Override
public void bindView(View view, Context context, Cursor cur) {        
    ....

    btnButtonON.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            tvText1.setText("Off");
        }
    );
    btnButtonOFF.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            tvText1.setText("Off");
        }
    );
}

Кстати, если вы ищете кнопку, которая отслеживает ее состояние, взгляните на ToggleButton, который можно установить на «вкл» и «выкл»

0 голосов
/ 05 декабря 2011

Содержит ссылку на родителя, который вы можете использовать позже.

, так что ..

public class ModuleCursorAdapter extends ResourceCursorAdapter 
 implements OnClickListener {

View mView = null;

public void bindView(View view, Context context, Cursor cur) { 

   mView = view;
   ...
}

, а затем

 public void btnButtonONclicked(View view) {
     TextView tvText1 = mView.findViewById(R.id.text1);
        tvText1.setText("On");
 }
0 голосов
/ 04 декабря 2011

Сделать tvText1 в качестве поля уровня класса для Button onClick Listener

class MyListener extends OnClickListener{
    private TextView tvText1;
    public MyListener(TextView tv) {
        this.tvText1 = tv;
    }
    public void onClick(View v) { 
        tvText1.setText("OFF");

    }

}


@Override
public void bindView(View view, Context context, Cursor cur) {        
    TextView tvText1 = (TextView)view.findViewById(R.id.text1);
    TextView tvText2 = (TextView)view.findViewById(R.id.text2);
    TextView tvText3 = (TextView)view.findViewById(R.id.text3);
    TextView tvText4 = (TextView)view.findViewById(R.id.text4);
    ImageView ivIcon = (ImageView)view.findViewById(R.id.icon);
    Button btnButtonON = (Button)view.findViewById(R.id.buttonON);
    Button btnButtonOFF = (Button)view.findViewById(R.id.buttonOFF);

    tvText1.setText(cur.getString(cur.getColumnIndex(NotesDbAdapter.KEY_TITLE)));
    tvText2.setText(cur.getString(cur.getColumnIndex(NotesDbAdapter.KEY_DEVICETYPE)));
    tvText3.setText(cur.getString(cur.getColumnIndex(NotesDbAdapter.KEY_HOMECODE)));
    tvText4.setText(cur.getString(cur.getColumnIndex(NotesDbAdapter.KEY_DEVICECODE)));

    .....

    btnButtonON.setTag(id);

    btnButtonOFF.setTag(id);
    MyListener listener = new MyListener(tvText1);

    btnButtonOFF.setOnClickListener(listener);
0 голосов
/ 04 декабря 2011

Попробуйте следующее

TextView tvText1 = (TextView)view.getParent().findViewById(..)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...