我有一个工作正常的ListView,直到我尝试添加搜索栏。我确实需要重新格式化活动并使用不同类型的数组,因此也可以。 基本上,当我尝试点击模拟器上的ListView中的项目时,它说“不幸的是,myapp已停止”。我会发布代码,希望我在一个容易修复的地方犯了一个愚蠢的错误。
SecondScreenActivity.java(ListView活动)
import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.TextView;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
public class SecondScreenActivity extends Activity
{
// List view
private ListView lv;
// Listview Adapter
ArrayAdapter<String> adapter;
// Search EditText
EditText inputSearch;
// ArrayList for Listview
ArrayList<HashMap<String, String>> productList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Listview Data
String products[] = {"Recipe1", "Recipe2", "Recipe3", "Recipe4", "Recipe5",
"Recipe6", "Recipe7", "Recipe8", "Recipe9", "Recipe10"};
lv = (ListView) findViewById(R.id.mainListView);
inputSearch = (EditText) findViewById(R.id.inputSearch);
// Adding items to listview
adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.product_name, products);
lv.setAdapter(adapter);
// Enabling search filter
inputSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
// When user changed the Text
SecondScreenActivity.this.adapter.getFilter().filter(cs);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
}
});
// register onClickListener to handle click events on each item
lv.setOnItemClickListener(new OnItemClickListener()
{
// argument position gives the index of item which is clicked
public void onItemClick(AdapterView<?> parent, View itemClicked,
int position, long id) {
TextView textView = (TextView) itemClicked;
String strText = textView.getText().toString();
Intent intenttwo = new Intent(SecondScreenActivity.this, ThirdScreenActivity.class);
intenttwo.putExtra("position", strText);
startActivity(intenttwo);
}
});
}
}
ThirdScreenActivity.java(应在项目点击时打开)
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
public class ThirdScreenActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.screen2);
//Sets the title to recipe name
TextView t = ((TextView)findViewById(R.id.textviewPosition));
Intent intent = getIntent();
String position = intent.getStringExtra("position");
t.setText(position);
//Sets the correct recipe
if ("Recipe1".equals(position)) {
TextView RecipeTextView = ((TextView)findViewById(R.id.RecipeTextView));
RecipeTextView.setText(R.string.recipe1);
}
else if ("Recipe2".equals(position)) {
TextView RecipeTextView = ((TextView)findViewById(R.id.RecipeTextView));
RecipeTextView.setText(R.string.recipe2);
}
else if ("Recipe3".equals(position)) {
TextView RecipeTextView = ((TextView)findViewById(R.id.RecipeTextView));
RecipeTextView.setText(R.string.recipe3);
}
else if ("Recipe4".equals(position)) {
TextView RecipeTextView = ((TextView)findViewById(R.id.RecipeTextView));
RecipeTextView.setText(R.string.recipe4);
}
else if ("Recipe5".equals(position)) {
TextView RecipeTextView = ((TextView)findViewById(R.id.RecipeTextView));
RecipeTextView.setText(R.string.recipe5);
}
else if ("Recipe6".equals(position)) {
TextView RecipeTextView = ((TextView)findViewById(R.id.RecipeTextView));
RecipeTextView.setText(R.string.recipe6);
}
else if ("Recipe7".equals(position)) {
TextView RecipeTextView = ((TextView)findViewById(R.id.RecipeTextView));
RecipeTextView.setText(R.string.recipe7);
}
else if ("Recipe8".equals(position)) {
TextView RecipeTextView = ((TextView)findViewById(R.id.RecipeTextView));
RecipeTextView.setText(R.string.recipe8);
}
else if ("Recipe9".equals(position)) {
TextView RecipeTextView = ((TextView)findViewById(R.id.RecipeTextView));
RecipeTextView.setText(R.string.recipe9);
}
else if ("Recipe10".equals(position)) {
TextView RecipeTextView = ((TextView)findViewById(R.id.RecipeTextView));
RecipeTextView.setText(R.string.recipe10);
}
}
Main.xml(ListView布局)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#000000">
<TextView
android:id="@+id/textView1"
android:layout_width="fill_parent"
android:layout_height="50dp"
android:text="Recipes"
android:textColor="#33ccff"
android:textSize="40sp"
android:gravity="center_vertical|center_horizontal"
android:textAppearance="?android:attr/textAppearanceLarge" />
<EditText
android:id="@+id/inputSearch"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Search recipes..."
android:inputType="textVisiblePassword"/>
<ListView
android:id="@+id/mainListView"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
screen2.xml(项目点击时应打开的页面布局)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ffffff">
<TextView
android:id="@+id/textviewPosition"
android:layout_width="fill_parent"
android:layout_height="50dp"
android:textSize="40sp"
android:textColor="#33ccff"
android:gravity="center" />
<ScrollView
android:layout_height="fill_parent"
android:layout_width="fill_parent">
<TextView
android:id="@+id/RecipeTextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingTop="20dp"
android:textColor="#000000"
android:textSize="15sp" />
</ScrollView>
</LinearLayout>
最后,logcat。
06-24 23:11:33.350: E/AndroidRuntime(939): FATAL EXCEPTION: main
06-24 23:11:33.350: E/AndroidRuntime(939): java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.TextView
06-24 23:11:33.350: E/AndroidRuntime(939): at com.leopenrose.cookbook.SecondScreenActivity$2.onItemClick(SecondScreenActivity.java:80)
06-24 23:11:33.350: E/AndroidRuntime(939): at android.widget.AdapterView.performItemClick(AdapterView.java:298)
06-24 23:11:33.350: E/AndroidRuntime(939): at android.widget.AbsListView.performItemClick(AbsListView.java:1100)
06-24 23:11:33.350: E/AndroidRuntime(939): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2749)
06-24 23:11:33.350: E/AndroidRuntime(939): at android.widget.AbsListView$1.run(AbsListView.java:3423)
06-24 23:11:33.350: E/AndroidRuntime(939): at android.os.Handler.handleCallback(Handler.java:725)
06-24 23:11:33.350: E/AndroidRuntime(939): at android.os.Handler.dispatchMessage(Handler.java:92)
06-24 23:11:33.350: E/AndroidRuntime(939): at android.os.Looper.loop(Looper.java:137)
06-24 23:11:33.350: E/AndroidRuntime(939): at android.app.ActivityThread.main(ActivityThread.java:5041)
06-24 23:11:33.350: E/AndroidRuntime(939): at java.lang.reflect.Method.invokeNative(Native Method)
06-24 23:11:33.350: E/AndroidRuntime(939): at java.lang.reflect.Method.invoke(Method.java:511)
06-24 23:11:33.350: E/AndroidRuntime(939): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
06-24 23:11:33.350: E/AndroidRuntime(939): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
06-24 23:11:33.350: E/AndroidRuntime(939): at dalvik.system.NativeStart.main(Native Method)
我在logcat中看到了致命的异常,但我真的不知道该怎么做! 我很抱歉发布了这么多代码,但我认为没有任何可能没有帮助。谢谢你的帮助!
答案 0 :(得分:0)
列表中的每个项目都是LinearLayout类型。在你的onItemClick中,你将它类型转换为TextView,因此是ClassCastException。以下代码应该可以使用
lv.setOnItemClickListener(new OnItemClickListener()
{
// argument position gives the index of item which is clicked
public void onItemClick(AdapterView<?> parent, View itemClicked,
int position, long id) {
LinearLayout view = (LinearLayout) itemClicked;
TextView textView = (TextView)view.findViewById(R.id.textViewPosition);
String strText = textView.getText().toString();
Intent intenttwo = new Intent(SecondScreenActivity.this, ThirdScreenActivity.class);
intenttwo.putExtra("position", strText);
startActivity(intenttwo);
}
});