CursorAdapter和Button

时间:2011-12-04 18:02:57

标签: android button android-cursoradapter

我有一个数据库。数据库中的值显示在列表视图中。 listview有一个Bitmap,4个TextViews和2个Buttons。 我为我的2个按钮编写了两个不同的OnClickListener,但这两种方法都不成功。当我点击按钮时程序会崩溃,当它试图做“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");
        }
    };
}

感谢您的帮助。

干杯

菲利克斯

评论。

整个布局文件

<?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(“On”)。对于按钮,仍然有一个例外。对于Off-button,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 个答案:

答案 0 :(得分:2)

您的TextView位于何处?或者更好:你能告诉我们你的整个布局文件吗?

两个OnClickListeners都传递了一个View引用,但正如你在documentation中读到的那样,参数是被点击的视图 - 换句话说:它将是对Buttons的引用。按钮肯定包含您正在寻找的文本视图,因此

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

将导致无法找到任何内容,tvText1将成为null。这就是你的nullpointer来自哪里以及为什么你的应用程序崩溃。

//编辑:一些代码来说明下面评论中提到的内容。

@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,可以将其设置为“开启”和“关闭”

答案 1 :(得分:0)

尝试以下

TextView tvText1 = (TextView)view.getParent().findViewById(..)

答案 2 :(得分:0)

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

答案 3 :(得分:0)

保留对您稍后可以使用的父级的引用。

所以..

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