Android listitem单击给予ClasscastException
当我点击列表项时,我得到ClasscastException。我想通过单击listitem转到详细信息屏幕Android listitem单击给予ClasscastException,android,listview,listitem,Android,Listview,Listitem,当我点击列表项时,我得到ClasscastException。我想通过单击listitem转到详细信息屏幕 Here is my code: private MyCustomAdapter dataAdapter = null; private View currentView = null; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-
Here is my code:
private MyCustomAdapter dataAdapter = null;
private View currentView = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.manager_leave_requests_list);
displayListView();
}
private void displayListView()
{
ArrayList<MLeaveRequests> lrList = new ArrayList<MLeaveRequests>();
MLeaveRequests requests = new MLeaveRequests("12345678", "Shyam",
"09/29/2013", "Earned Leave", 10, "08/28/2013", "08/28/2013", 1, "XYZ");
lrList.add(requests);
requests = new MLeaveRequests("22345678", "Shyam", "09/29/2013",
"Earned Leave", 10, "08/28/2013", "08/28/2013", 1, "XYZ");
lrList.add(requests);
requests = new MLeaveRequests("32345678", "Shyam", "09/29/2013",
"Earned Leave", 10, "08/28/2013", "08/28/2013", 1, "XYZ");
lrList.add(requests);
requests = new MLeaveRequests("42345678", "Shyam", "09/29/2013",
"Earned Leave", 10, "08/28/2013", "08/28/2013", 1, "XYZ");
lrList.add(requests);
requests = new MLeaveRequests("52345678", "Shyam", "09/29/2013",
"Earned Leave", 10, "08/28/2013", "08/28/2013", 1, "XYZ");
lrList.add(requests);
requests = new MLeaveRequests("62345678", "Shyam", "09/29/2013",
"Earned Leave", 10, "08/28/2013", "08/28/2013", 1, "XYZ");
lrList.add(requests);
requests = new MLeaveRequests("72345678", "Shyam", "09/29/2013",
"Earned Leave", 10, "08/28/2013", "08/28/2013", 1, "XYZ");
lrList.add(requests);
//create an ArrayAdaptar
dataAdapter = new MyCustomAdapter(this, R.layout.manager_leave_requests_list_item, lrList);
ListView list = (ListView) findViewById(R.id.mngrLeaveRequestsList) ;
list.setAdapter(dataAdapter);
list.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
currentView = view;
//get reference to the MLeaveRequests Object
MLeaveRequests requests = (MLeaveRequests) view.getTag();
Intent reqDetails = new Intent(ManagerLeaveRequestsList.this,LeaveRequestDetails.class);
Bundle b = new Bundle();
//pass the country object as a parcel
b.putParcelable("Request", requests);
reqDetails.putExtras(b);
startActivity(reqDetails);
}
});
}
private class MyCustomAdapter extends ArrayAdapter<MLeaveRequests>{
private ArrayList<MLeaveRequests> leaves;
public MyCustomAdapter(
Context context,
int managerLeaveRequestsListItem,
ArrayList<MLeaveRequests> lrList) {
// TODO Auto-generated constructor stub
super(context, managerLeaveRequestsListItem, lrList);
this.leaves = lrList;
}
public class ViewHolder{
TextView requestID = null;
TextView appliedBy = null;
TextView appliedOn = null;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder;
if(convertView == null)
{
LayoutInflater li = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = li.inflate(R.layout.manager_leave_requests_list_item, null);
holder = new ViewHolder();
holder.requestID = (TextView) convertView.findViewById(R.id.txtMLRID);
holder.appliedBy = (TextView) convertView.findViewById(R.id.txtMLRAppliedBy);
holder.appliedOn = (TextView) convertView.findViewById(R.id.txtMLRAppliedOn);
convertView.setTag(holder);
}
else
holder = (ViewHolder) convertView.getTag();
final MLeaveRequests mlr = leaves.get(position);
if(mlr != null){
mlr.setListPosition(position);
holder.requestID.setText(mlr.getRequestID());
holder.appliedBy.setText(mlr.getAppliedBy());
holder.appliedOn.setText(mlr.getAppliedOn());
}
return convertView;
}
}
不知道我为什么会犯这个错误。请帮助。在您的getView函数中
convertView.setTag(mlr)代码>前返回视图代码>
之所以会发生这种情况,是因为您正在setTag中使用ViewHolder对象,并将其强制转换为getTag上的MLeaveRequests对象
-------------------------------------编辑--------------------------------------------
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder;
LayoutInflater li = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = li.inflate(R.layout.manager_leave_requests_list_item, null);
holder = new ViewHolder();
holder.requestID = (TextView) convertView.findViewById(R.id.txtMLRID);
holder.appliedBy = (TextView) convertView.findViewById(R.id.txtMLRAppliedBy);
holder.appliedOn = (TextView) convertView.findViewById(R.id.txtMLRAppliedOn);
final MLeaveRequests mlr = leaves.get(position);
convertView.setTag(mlr);
if(mlr != null){
mlr.setListPosition(position);
holder.requestID.setText(mlr.getRequestID());
holder.appliedBy.setText(mlr.getAppliedBy());
holder.appliedOn.setText(mlr.getAppliedOn());
}
return convertView;
}
你好,热汉,你能告诉我如何更改代码吗。我是android的初学者。在你的MyCustomAdapter
类中,进入函数public View getView(int位置,View convertView,ViewGroup父级)
并编写convertView.setTag(mlr)代码>就在行返回视图之前代码>如果您仍然遇到任何问题,请随时询问:)Hi Rehan,即使在添加convertView.setTag(mlr)之后;返回视图;我也犯了同样的错误。任何其他帮助。那么可能是因为您正在设置多个标记。。。尝试替换convertView.setTag(mlr)代码>带有convertView.setTag(标记ID,mlr)
和在列表中.setOnItemClickListener
替换MLeaveRequests请求=(MLeaveRequests)视图.getTag()
toMLeaveRequests requests=(MLeaveRequests)view.getTag(TAG_ID)代码>和私有最终整数标签_ID=1代码>在类级别初始化标记ID
。。。我希望它能工作,如果仍然给出相同的错误,请通知我,我将告诉您代码,而不使用viewHolder类,这肯定对您有效:)Hi Rehan,在进行上述更改后,我收到一个错误:java.lang.illegalArgumentException:密钥必须是convertView.setTag(TAG_id,mlr)行中的特定于应用程序的资源id;
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder;
LayoutInflater li = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = li.inflate(R.layout.manager_leave_requests_list_item, null);
holder = new ViewHolder();
holder.requestID = (TextView) convertView.findViewById(R.id.txtMLRID);
holder.appliedBy = (TextView) convertView.findViewById(R.id.txtMLRAppliedBy);
holder.appliedOn = (TextView) convertView.findViewById(R.id.txtMLRAppliedOn);
final MLeaveRequests mlr = leaves.get(position);
convertView.setTag(mlr);
if(mlr != null){
mlr.setListPosition(position);
holder.requestID.setText(mlr.getRequestID());
holder.appliedBy.setText(mlr.getAppliedBy());
holder.appliedOn.setText(mlr.getAppliedOn());
}
return convertView;
}