在Android的列表视图中选择项目

时间:2013-09-25 10:51:40

标签: java android sqlite

我是android开发的新手。我有一个sqllite表,包含id,name,number。

我尝试做以下事情:

  1. 列出表格中的名称。
  2. 点击特定名称,转到另一个XML页面并显示名称和号码。
  3. 我可以列出名字(第一个)。但是当单击列表中的名称时,logcat会显示以下错误。

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

    Details.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" />
    

3 个答案:

答案 0 :(得分: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.

此外,您需要传递名称&amp; openDetails方法中onItemClick方法的数字参数,如下所示:

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);
     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();
                */

    }
});

希望这会有所帮助:)

答案 1 :(得分: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());

答案 2 :(得分:0)

在OnItemClick方法中,您有以下行:

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

list.getItemAtPosition(position)的结果是一个字符串,但您正在尝试将其转换为游标。

因此您收到错误:

 java.lang.ClassCastException: java.lang.String cannot be cast to android.database.Cursor