2012-06-22 21 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); 

    } 

}); 
相關問題