2012-06-22 22 views
4

我为我的ListView实施了自定义适配器。如何从特定的列表项中提取对象。这里是我的自定义适配器的外观:如何从ListView中提取对象 - getItemAtPosition不起作用

MyCustomAdapter.java

public class MyCustomAdapter extends ArrayAdapter<DashboardBean> { 


Context context; 
int layoutResourceId; 
DashboardBean currentMRB; 
Vector<DashboardBean> data; 

public MyCustomAdapter(Context context, int layoutResourceId, Vector<DashboardBean> data) 
{ 
    super(context,layoutResourceId,data); 
    this.layoutResourceId = layoutResourceId; 
    this.context=context; 
    this.data = data; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    View row = convertView; 
    MyStringReaderHolder holder; 

    if(row==null) 
    { 
     LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
     row = inflater.inflate(layoutResourceId, parent,false); 

     holder= new MyStringReaderHolder(); 

     holder.project = (TextView)row.findViewById(R.id.project); 
     holder.workRequest = (TextView)row.findViewById(R.id.work_request); 
     holder.startDate = (TextView)row.findViewById(R.id.start_date); 
     holder.status = (TextView) row.findViewById(R.id.status); 

     row.setTag(holder); 
    } 
    else 
    { 
     holder=(MyStringReaderHolder) row.getTag(); 
    } 

    DashboardBean mrb =data.elementAt(position); 
    System.out.println("Position="+position); 

    holder.project.setText(mrb.project); 
    holder.workRequest.setText(mrb.workRequest); 
    holder.startDate.setText(mrb.startDate); 
    holder.status.setText(mrb.status); 
    return row; 
} 





static class MyStringReaderHolder { 
    TextView project, workRequest, startDate, status; 

    } 
} 

这里的DashboardBean.java

public class DashboardBean { 

    public String project; 
    public String workRequest; 
    public String startDate; 
    public String status; 

    public DashboardBean(String project,String workRequest,String startDate,String status) 
    { 
     this.project = project; 
     this.workRequest = workRequest; 
     this.startDate = startDate; 
     this.status = status; 
    } 
} 

这里的Java代码从那里我打电话onClickListener():

mListView.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> myAdapter, View myView, 
      int myItemInt, long mylng) { 
     TableRow tableRow = (TableRow) (mListView.getItemAtPosition(myItemInt)); 

     String project = ((TextView) tableRow.findViewById(R.id.project)).getText().toString(); 
     String workRequest = ((TextView) tableRow.findViewById(R.id.work_request)).getText().toString(); 
     String startDate = ((TextView) tableRow.findViewById(R.id.start_date)).getText().toString(); 
     String status = ((TextView) tableRow.findViewById(R.id.status)).getText().toString(); 

      showWorkRequest(project, workRequest, startDate, status); 

     } 

    }); 

和xml代码:

<?xml version="1.0" encoding="utf-8"?> 
<TableRow xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/tabRow1" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    style="@style/BodyRow" 
    android:gravity="center_horizontal" > 

    <RelativeLayout 
    android:id="@+id/relativeLayout1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 

    android:gravity="center_horizontal" > 

    <TextView 
     android:id="@+id/status" 
     android:layout_width="wrap_content" 
     style="@style/BodyText" 
     android:layout_height="wrap_content" 

     android:layout_alignParentRight="true" 
     android:textColor="@color/textColor" 
     android:text="TextView" /> 

    <TextView 
     android:id="@+id/start_date" 
     style="@style/HourText" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:text="TextView" android:textColor="@color/textColor" android:textSize="10sp"/> 

    <TextView 
     android:id="@+id/project" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_toRightOf="@+id/start_date" 
     android:gravity="center_horizontal" 
     style="@style/LeftHeaderText" 
     android:text="TextView" android:layout_marginLeft="5dp" 
     android:textColor="@color/textColor" android:textStyle="bold"/> 

    <TextView 
     android:id="@+id/work_request" 
     android:layout_width="wrap_content" 
     style="@style/BodyText" 
     android:layout_height="wrap_content" 
     android:layout_alignLeft="@+id/project" 
     android:layout_below="@+id/project" 
     android:text="TextView" 
     android:textColor="@color/textColor" /> 

</RelativeLayout> 
</TableRow> 

我想我不能使用onClickListener,因为它通常使用,因为我是extendind自定义适配器。在这种情况下,他们可能是一个问题

public void onItemClick(AdapterView<?> myAdapter, View myView, 
      int myItemInt, long mylng) 

但日志说:ClassCastException at DashboardBean。

无论如何,我无法修复它。谁能帮忙?

+0

凡恰恰是ClassCastException异常?你想在哪里附加听众,整个listitem或某些项目? – Ixx

回答

10

ClassCastException由下面的行放在OnItemClickListener造成的:

TableRow tableRow = (TableRow) (mListView.getItemAtPosition(myItemInt)); 

那是因为你的适配器填充了DashboardBean实例。 getItemAtPosition方法返回一个属于适配器使用的数据结构的对象,而不是图形窗口小部件的实例(TableRow,我假设)显示对象。只写:

DashboardBean board = (DashboardBean) (mListView.getItemAtPosition(myItemInt)); 

将取代这个诡计。然后,您可以直接使用DashboardBean对象中的字段,而不是通过TextView和类似的UI元素。

4

你应该能够得到您的DashboardBean对象onItemclick这样的:

DashboardBean bean = (DashboardBean) mListView.getItemAtPosition(myItemInt); 
3

如果您只是想提取对象,那么OnItemClickListener使您的任务更容易。您可以查看该行的实例,从中可以提取内容。

变化

mListView.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> myAdapter, View myView, 
      int myItemInt, long mylng) { 
     TableRow tableRow = (TableRow) (mListView.getItemAtPosition(myItemInt)); 

     String project = ((TextView) tableRow.findViewById(R.id.project)).getText().toString(); 
     String workRequest = ((TextView) tableRow.findViewById(R.id.work_request)).getText().toString(); 
     String startDate = ((TextView) tableRow.findViewById(R.id.start_date)).getText().toString(); 
     String status = ((TextView) tableRow.findViewById(R.id.status)).getText().toString(); 

      showWorkRequest(project, workRequest, startDate, status); 

     } 

    }); 

为了这

mListView.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView <? > myAdapter, View myView, int myItemInt, long mylng) { 


     String project = ((TextView) myView.findViewById(R.id.project)).getText().toString(); 
     String workRequest = ((TextView) myView.findViewById(R.id.work_request)).getText().toString(); 
     String startDate = ((TextView) myView.findViewById(R.id.start_date)).getText().toString(); 
     String status = ((TextView) myView.findViewById(R.id.status)).getText().toString(); 

     showWorkRequest(project, workRequest, startDate, status); 

    } 

}); 
相关问题