0

ListViewクリック可能なリストエントリを作成しようとしています。エントリがクリックされたときに実行したいのは、トーストメッセージを表示することです。ただし、エントリをクリックするとすぐにアプリケーションがクラッシュします。なぜそうなるのかよくわかりません。これは私のコードです:

package com.andriesse.android.dailyproductivity;

import java.util.ArrayList;

import com.andriesse.android.dailyproductivity.MyDB;

public class Main extends Activity implements OnItemClickListener, OnKeyListener {

ListView listview;

MyDB mydb;
TaskAdapter myadapter;

private class MyTask {
    public MyTask(String t) {
        task = t;
    }

    public String task;
}

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.main);

    listview = (ListView) findViewById(R.id.listview);
    listview.setOnItemClickListener(this);

    mydb = new MyDB(this);
    mydb.open();

    myadapter = new TaskAdapter(this);

    listview.setAdapter(myadapter); 

}

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    String item = ((TextView)view).getText().toString();
    Toast.makeText(getBaseContext(), item, Toast.LENGTH_LONG).show();
}

private class TaskAdapter extends BaseAdapter {
    private LayoutInflater layoutinflater;
    private ArrayList<MyTask> arraylist;

    public TaskAdapter(Context context) {
        layoutinflater = LayoutInflater.from(context);
        arraylist = new ArrayList<MyTask>();
        getdata();
    }

    public void getdata() {
        Cursor c = mydb.getTasks();
        startManagingCursor(c);
        if (c.moveToFirst()) {
            do {
                String task = c.getString(c
                        .getColumnIndex(Constants.TASK_NAME));
                MyTask temp = new MyTask(task);
                arraylist.add(temp);
            } while (c.moveToNext());
        }
    }

    public int getCount() {
        return arraylist.size();
    }

    public MyTask getItem(int i) {
        return arraylist.get(i);
    }

    public long getItemId(int i) {
        return i;
    }

    public View getView(int i, View view, ViewGroup group) {            
        ViewHolder holder;
        if (view == null || view.getTag() == null) {
            view = layoutinflater.inflate(R.layout.rowlayout, null);
            holder = new ViewHolder();
            holder.textview = (TextView) view.findViewById(R.id.textview);
            view.setTag(holder);
        } else {
            holder = (ViewHolder) view.getTag();
        }

        holder.mytask = getItem(i);
        holder.textview.setText(holder.mytask.task);

        return view;
    }

    public class ViewHolder {
        MyTask mytask;
        TextView textview;
    }
}

private void addItem(String item) {
    if (item.length() > 0) {
        try {
            saveTaskToDB(item);
            myadapter.arraylist.add(new MyTask(item));
            myadapter.notifyDataSetChanged();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

public void saveTaskToDB(String task) {
    mydb.insertTask(task);
}

@Override
public void onDestroy() {
    super.onDestroy();
    mydb.close();
}

public boolean onKey(View v, int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub
    return false;
}

}

そして、これが私のLogCatログです。

06-09 20:50:41.743: E/AndroidRuntime(194): Uncaught handler: thread main exiting due to uncaught exception
06-09 20:50:41.773: E/AndroidRuntime(194): java.lang.ClassCastException: android.widget.RelativeLayout
06-09 20:50:41.773: E/AndroidRuntime(194):  at com.andriesse.android.dailyproductivity.Main.onItemClick(Main.java:57)
06-09 20:50:41.773: E/AndroidRuntime(194):  at android.widget.AdapterView.performItemClick(AdapterView.java:284)
06-09 20:50:41.773: E/AndroidRuntime(194):  at android.widget.ListView.performItemClick(ListView.java:3285
06-09 20:50:41.773: E/AndroidRuntime(194):  at android.widget.AbsListView$PerformClick.run(AbsListView.java:1640)
06-09 20:50:41.773: E/AndroidRuntime(194):  at android.os.Handler.handleCallback(Handler.java:587)
06-09 20:50:41.773: E/AndroidRuntime(194):  at android.os.Handler.dispatchMessage(Handler.java:92)
06-09 20:50:41.773: E/AndroidRuntime(194):  at android.os.Looper.loop(Looper.java:123)
06-09 20:50:41.773: E/AndroidRuntime(194):  at android.app.ActivityThread.main(ActivityThread.java:4363)
06-09 20:50:41.773: E/AndroidRuntime(194):  at java.lang.reflect.Method.invokeNative(Native Method)
06-09 20:50:41.773: E/AndroidRuntime(194):  at java.lang.reflect.Method.invoke(Method.java:521)
06-09 20:50:41.773: E/AndroidRuntime(194):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
06-09 20:50:41.773: E/AndroidRuntime(194):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
06-09 20:50:41.773: E/AndroidRuntime(194):  at dalvik.system.NativeStart.main(Native Method)
4

1 に答える 1

2

スタックトレースを投稿します。あなたがそれを追加するならば、我々は助けることができる可能性が高いです。

問題はおそらくビューをTextViewにキャストしようとしている方法にあると思いますが。パラメータとして入ってくるビューはおそらくTextViewではなく、ある種の親レイアウトである可能性があります。あなたはおそらく使用する必要があります

TextView mTxt = (TextView)view.findViewById(R.id.yourEdtTxtID); 

TextViewへの参照を取得するには

また、おそらく、そのようなクリックリスナーで行のTextViewのテキストを手動で変更するべきではありません。値を変更する必要がある場合は、値を好きなように変更できるデータ構造のアダプターを使用する必要があります。アダプターがListViewに設定されると、画面上のビューが自動的に更新されます。構造内のデータを変更するとき。

于 2012-06-09T18:52:58.020 に答える