2012-06-09 46 views
0

我正在嘗試使用可點擊的列表條目製作ListView。當我點擊一個條目時,我想要做的是顯示一條Toast消息。但是,只要我點擊一個條目,應用程序就會崩潰。我真的不明白爲什麼它會這樣做。這是我的代碼:OnItemClick崩潰

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) 
+0

您使用的是什麼_Adapter_? –

+0

根據傳遞給適配器的佈局,「視圖視圖」可能是一個LinearLayout(或類似的),因此將佈局轉換爲TextView並試圖使用getText()會每次都會崩潰。 – Sam

+0

請添加一些日誌。 –

回答

2

張貼堆棧跟蹤。如果添加它,我們更有可能提供幫助。

我可以告訴你,雖然問題可能來自您如何將視圖轉換爲TextView。作爲參數進入的視圖可能不是TextView,它可能是某種父佈局。您可能需要使用

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

得到一個參考的TextView

而且雖然你可能不應該在一個行的TextView的手動點擊收聽這樣的更改文本。如果您需要更改值,您應該使用具有數據結構的適配器,該適配器將允許您將值更改爲任何您喜歡的值,並且一旦適配器在您的ListView上設置,它就會自動爲您更新屏幕上的視圖當你改變結構中的數據時。

+0

首先,感謝您的快速響應! ^^其次,我現在發佈了我的代碼和我的LogCat日誌。 – Zero

+1

試試我的答案是什麼,應該有效。但也應該像我提到的那樣使用適配器。 – FoamyGuy

+0

它的工作!非常感謝! – Zero