Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to extract objects from ListView - getItemAtPosition won't work

I've a custom adapter implemented for my ListView. How do I extract objects from a particular list item. Here's how my custom adapter looks:

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;

   }
}

Here's the 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;
    }
}

Here's java snippet from where I call 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);

      }

  });

And the xml code:

<?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>

I guess I can't use onClickListener as it is usually used because I'm extendind custom adapter. In that case they may be a problem with

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

But the log says: ClassCastException at DashboardBean.

Anyway, I can't fix it. Could anyone help?

like image 376
Harsh Avatar asked Jun 22 '12 21:06

Harsh


3 Answers

The ClassCastException is caused by the following line in your OnItemClickListener:

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

And that's because your adapter is filled with DashboardBean instances. The getItemAtPosition method returns an object belonging to the data structure the adapter works with, not an instance of the graphic widget (TableRow, I assume) which the object is shown on. Just writing:

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

in place of the offending line would do the trick. You can then work directly with the fields in the DashboardBean object instead of passing through TextViews and similar UI elements.

like image 188
Giulio Piancastelli Avatar answered Nov 19 '22 10:11

Giulio Piancastelli


You should be able to get your DashboardBean object in onItemclick like this:

DashboardBean bean = (DashboardBean) mListView.getItemAtPosition(myItemInt);
like image 4
Jules Colle Avatar answered Nov 19 '22 12:11

Jules Colle


If you just want to extract object then OnItemClickListener makes your task easier.You ger view instance of the row.from that you can extract the contents.

Change

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);

      }

  });

To This

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);

    }

});
like image 3
Vipul Avatar answered Nov 19 '22 11:11

Vipul