如何从ListView中提取对象-getItemAtPosition无法正常工作 [英] How to extract objects from ListView - getItemAtPosition won't work
问题描述
我为我的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 TextView
s and similar UI elements.
这篇关于如何从ListView中提取对象-getItemAtPosition无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!