如何从ListView中提取对象-getItemAtPosition无法正常工作 [英] How to extract objects from ListView - getItemAtPosition won't work

查看:63
本文介绍了如何从ListView中提取对象-getItemAtPosition无法正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我为我的ListView实现了一个自定义适配器.如何从特定列表项中提取对象.这是我的自定义适配器的外观:

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

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

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

这是我调用onClickListener()的Java代码段:

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

      }

  });

以及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自定义适配器.在这种情况下,它们可能是一个问题

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)

但是日志显示:DashboardBean上的ClassCastException.

But the log says: ClassCastException at DashboardBean.

无论如何,我无法修复它.有人可以帮忙吗?

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

推荐答案

ClassCastException是由OnItemClickListener中的以下行引起的:

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

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

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

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

代替违规行将达到目的.然后,您可以直接使用DashboardBean对象中的字段,而不用通过TextView和类似的UI元素.

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.

这篇关于如何从ListView中提取对象-getItemAtPosition无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆