0

私はアンドロイド開発の初心者です。sqllite にテーブルがあり、ID、名前、番号が含まれています。

私は次のことをしようとしています:

  1. 表に名前をリストします。
  2. 特定の名前をクリックし、別の XML ページに移動して名前と番号を表示します。

名前をリストできます(最初の名前)。しかし、リスト内の名前をクリックすると、logcat は次のエラーを表示します。

09-25 06:42:24.071: E/AndroidRuntime(32364): java.lang.ClassCastException: java.lang.String cannot be cast to android.database.Cursor

詳細.java

public class Details extends ListActivity {
private DetailOperations detailDBoperation;
@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.details);
    detailDBoperation=new DetailOperations(this);
    detailDBoperation.open();
    final ListView list=(ListView) findViewById(android.R.id.list);
    List<Detail> values=detailDBoperation.getAllDetails();
    List<String> names=new ArrayList<String>();
    for(int i=0;i<values.size();i++)
    {
      names.add(values.get(i).getName()); 
    }
    ArrayAdapter adapter=new ArrayAdapter(this,android.R.layout.simple_list_item_1,names);
    list.setAdapter(adapter);

    //click on the list item
    list.setClickable(true);
    list.setTextFilterEnabled(true);
    list.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> arg0, View view, int position, long id) {

         Cursor cursor=(Cursor) list.getItemAtPosition(position);
         TextView text1=(TextView) findViewById(R.id.nametext);
         text1.setText(cursor.getString(1).toString());
         TextView text2=(TextView)findViewById(R.id.numbertext);
         text2.setText(cursor.getString(2).toString());
         openDetails();

       /*   AlertDialog.Builder adb=new AlertDialog.Builder(Details.this); 
            adb.setTitle("ListView OnClick");
            adb.setMessage("Selected item="+ list.getItemAtPosition(position));
            adb.setPositiveButton("Ok",null);
            adb.show();
                    */

        }
    });

}
public void openDetails(){
    Intent intent=new Intent(this,ShowDetails.class);
    startActivity(intent);
}

@Override
protected void onResume(){
    detailDBoperation.open();
    super.onResume();
}
@Override
protected void onPause(){
    detailDBoperation.close();
    super.onPause();
}

    }

showDetails.java

    public class ShowDetails extends Activity{
public void onCreate(Bundle savedInstaceState){
    super.onCreate(savedInstaceState);
    setContentView(R.layout.showdetails);

}
   }

details.xml

 <ListView
    android:cacheColorHint="#00000000"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:id="@android:id/list"
    android:layout_alignParentLeft="true"
    android:textSize="15dp" >
</ListView>

showdetails.xml

    <TextView
    android:id="@+id/nametext"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="TextView" />

<TextView
    android:id="@+id/numbertext"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="TextView" />
4

3 に答える 3

1

値を新しいアクティビティに送信しようとしている場合は、次のようにする必要があります。

詳細メソッドを次のように変更します。

public void openDetails(String name, String number)
{
    Intent intent=new Intent(this,ShowDetails.class);
    intent.putExtra("name", name);
    intent.putExtra("number", number);
    startActivity(intent);
}

新しいアクティビティの onCreate で、次のようにします。

String name = getIntent().getExtras().getString("name");
String number = getIntent().getExtras().getString("number");

TextView nameText = (TextView)findViewById(R.id.nametext);
TextView numberText = (TextView)findViewById(R.id.numbertext);  

nameText.setText(name);
numberText.setText(number); // I'm assuming you've already created instances of these textviews.

openDetailsまた、次のように、名前と番号のパラメーターをメソッドからメソッドに渡す必要がありますonItemClick

list.setOnItemClickListener(新しいOnItemClickListener() {

    public void onItemClick(AdapterView<?> arg0, View view, int position, long id) {

     Cursor cursor=(Cursor) list.getItemAtPosition(position);
     TextView text1=(TextView) findViewById(R.id.nametext);
     String name = cursor.getString(1).toString();
     //text1.setText(name);
     TextView text2=(TextView)findViewById(R.id.numbertext);
     String number = cursor.getString(2).toString();
     //text2.setText(number);
     openDetails(name, number);

   /*   AlertDialog.Builder adb=new AlertDialog.Builder(Details.this); 
        adb.setTitle("ListView OnClick");
        adb.setMessage("Selected item="+ list.getItemAtPosition(position));
        adb.setPositiveButton("Ok",null);
        adb.show();
                */

    }
});

お役に立てれば :)

于 2013-09-25T11:18:34.487 に答える
0

に渡しString arrayて、データベース テーブルArrayadapterに返すことを期待していますか?cursor

OnItemClick() では、この行がこの例外を引き起こしています:

Cursor cursor=(Cursor) list.getItemAtPosition(position);

あなたができることは、List<Detail> values外部で宣言しonCreate()、これに従うことです:

     TextView text1=(TextView) findViewById(R.id.nametext);
      text1.setText(values.get(position).getName());
     TextView text2=(TextView)findViewById(R.id.numbertext);
     text2.setText(values.get(position).getNumber());
于 2013-09-25T10:58:09.587 に答える
0

OnItemClick メソッドには次の行があります。

   Cursor cursor=(Cursor) list.getItemAtPosition(position);

の結果list.getItemAtPosition(position)は文字列ですが、それをカーソルに変換しようとしています。

したがって、次のエラーが表示されます。

 java.lang.ClassCastException: java.lang.String cannot be cast to android.database.Cursor
于 2013-09-25T10:58:10.710 に答える