自定义列表视图点击侦听器无法正常工作
Custom listview click listener not working perfectly
我只是需要帮助解决列表视图点击监听器中的棘手情况。问题是我已经使用来自远程服务器的自定义适配器填充了一个列表视图。我的列表视图包含 4 个元素、2 个图像和 2 个文本视图,因此列表视图可以从数据库中完美加载,但问题是我希望列表视图仅在某些条件匹配时才工作。看看我的代码:
if (convertView == null) {
convertView = inflater.inflate(resource, null);
}
ImageView team1_photo,team2_photo;
TextView tournament;
team1_photo = (ImageView) convertView.findViewById(R.id.team1);
team2_photo = (ImageView) convertView.findViewById(R.id.team2);
tournament=(TextView) convertView.findViewById(R.id.tournament);
status=(TextView) convertView.findViewById(R.id.status);
ImageLoader.getInstance().displayImage(live_conveyerList.get(position).getTeam1_photo(), team1_photo);
ImageLoader.getInstance().displayImage(live_conveyerList.get(position).getTeam2_photo(), team2_photo);
tournament.setText(live_conveyerList.get(position).getTournament());
status.setText(live_conveyerList.get(position).getStatus());
liveListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
switch (position) {
case 0:
if(status.getText().equals("play on"))
{
Toast.makeText(getActivity(),"Result will be declared shortly",Toast.LENGTH_LONG).show();
}
else {
Intent fix1 = new Intent(getActivity(), Leaderboard.class);
startActivity(fix1);
}
break;
case 1:
if(status.getText().equals("play on"))
{
Toast.makeText(getActivity(), "Result will be declared shortly", Toast.LENGTH_LONG).show();
}
else{
Intent fix2 = new Intent(getActivity(), Leaderboard_1.class);
startActivity(fix2);
}
break;
default:
}
getActivity().overridePendingTransition(R.anim.activity_in, R.anim.activity_out);
}
}
);
return convertView;
}
}
所以在这里,状态是文本视图之一,它有两种类型的输出。一个是 "play on",另一个是 "play off",所以我只想打开新的 activity,只有当它在那个特殊的行中播放时才打开。 Els,e 应该只祝酒,
但它对我不起作用。任何帮助都会很好,谢谢。
我的json是这样的
{"list":[{"tournament":"Xavier college League","team1_photo":"http:\/\/thehostels.in\/judgement_files\/images\/India.png","team2_photo":"http:\/\/thehostels.in\/judgement_files\/images\/Australia.png","status":"play on"},{"tournament":"ITM college League","team1_photo":"http:\/\/thehostels.in\/judgement_files\/images\/India.png","team2_photo":"http:\/\/thehostels.in\/judgement_files\/images\/Australia.png","status":"play off"}]}
在您的案例 0 中,您有 "Play on" 大写 P,但默认情况下 equals 会考虑这种情况,这可能是您的问题吗?
编辑:好的,我想我明白了
您定义 onItemClickListener 不是一次,而是为每个项目定义,以便在列表填充结束时,您的侦听器基于列表最后一项的状态
您应该只定义一次 onItemClickListener,并且您将点击带有视图和位置参数的项目
例如,您可能希望将所有项目的列表存储为一个字段,并且在您的 onItemClickListener 中,您将从该位置获得被点击的项目,从而获得其状态
使用视图参数,您应该能够通过 findViewById
访问字段的值
编辑 2:
我的意思是:只有一个 onItemClickListener 需要定义,onItemClick 方法将提供点击项目的位置和视图。
这意味着每次用户单击列表中的任何一项时,都会调用侦听器,但每一行都没有一个不同的侦听器。
考虑到这一点,在 onItemClick 中,通过视图 and/or 的位置,您可以访问状态文本视图,获取它的值,然后执行您需要对 toast 和 intent 执行的所有操作.我希望它比以前更清楚
编辑 3:
那应该做你的事:在你的听众中,在你切换之前,
TextView currentStatus=(TextView) convertView.findViewById(R.id.status);
然后您用 currentStatus 替换侦听器中所有对状态的引用。而且你只需要在你的 getView 方法之外定义一次监听器,甚至在你的适配器之外,而不是在你的 listView 被定义并且你的适配器被添加到它的地方
我只是需要帮助解决列表视图点击监听器中的棘手情况。问题是我已经使用来自远程服务器的自定义适配器填充了一个列表视图。我的列表视图包含 4 个元素、2 个图像和 2 个文本视图,因此列表视图可以从数据库中完美加载,但问题是我希望列表视图仅在某些条件匹配时才工作。看看我的代码:
if (convertView == null) {
convertView = inflater.inflate(resource, null);
}
ImageView team1_photo,team2_photo;
TextView tournament;
team1_photo = (ImageView) convertView.findViewById(R.id.team1);
team2_photo = (ImageView) convertView.findViewById(R.id.team2);
tournament=(TextView) convertView.findViewById(R.id.tournament);
status=(TextView) convertView.findViewById(R.id.status);
ImageLoader.getInstance().displayImage(live_conveyerList.get(position).getTeam1_photo(), team1_photo);
ImageLoader.getInstance().displayImage(live_conveyerList.get(position).getTeam2_photo(), team2_photo);
tournament.setText(live_conveyerList.get(position).getTournament());
status.setText(live_conveyerList.get(position).getStatus());
liveListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
switch (position) {
case 0:
if(status.getText().equals("play on"))
{
Toast.makeText(getActivity(),"Result will be declared shortly",Toast.LENGTH_LONG).show();
}
else {
Intent fix1 = new Intent(getActivity(), Leaderboard.class);
startActivity(fix1);
}
break;
case 1:
if(status.getText().equals("play on"))
{
Toast.makeText(getActivity(), "Result will be declared shortly", Toast.LENGTH_LONG).show();
}
else{
Intent fix2 = new Intent(getActivity(), Leaderboard_1.class);
startActivity(fix2);
}
break;
default:
}
getActivity().overridePendingTransition(R.anim.activity_in, R.anim.activity_out);
}
}
);
return convertView;
}
}
所以在这里,状态是文本视图之一,它有两种类型的输出。一个是 "play on",另一个是 "play off",所以我只想打开新的 activity,只有当它在那个特殊的行中播放时才打开。 Els,e 应该只祝酒, 但它对我不起作用。任何帮助都会很好,谢谢。
我的json是这样的
{"list":[{"tournament":"Xavier college League","team1_photo":"http:\/\/thehostels.in\/judgement_files\/images\/India.png","team2_photo":"http:\/\/thehostels.in\/judgement_files\/images\/Australia.png","status":"play on"},{"tournament":"ITM college League","team1_photo":"http:\/\/thehostels.in\/judgement_files\/images\/India.png","team2_photo":"http:\/\/thehostels.in\/judgement_files\/images\/Australia.png","status":"play off"}]}
在您的案例 0 中,您有 "Play on" 大写 P,但默认情况下 equals 会考虑这种情况,这可能是您的问题吗?
编辑:好的,我想我明白了 您定义 onItemClickListener 不是一次,而是为每个项目定义,以便在列表填充结束时,您的侦听器基于列表最后一项的状态 您应该只定义一次 onItemClickListener,并且您将点击带有视图和位置参数的项目
例如,您可能希望将所有项目的列表存储为一个字段,并且在您的 onItemClickListener 中,您将从该位置获得被点击的项目,从而获得其状态
使用视图参数,您应该能够通过 findViewById
访问字段的值编辑 2: 我的意思是:只有一个 onItemClickListener 需要定义,onItemClick 方法将提供点击项目的位置和视图。 这意味着每次用户单击列表中的任何一项时,都会调用侦听器,但每一行都没有一个不同的侦听器。
考虑到这一点,在 onItemClick 中,通过视图 and/or 的位置,您可以访问状态文本视图,获取它的值,然后执行您需要对 toast 和 intent 执行的所有操作.我希望它比以前更清楚
编辑 3: 那应该做你的事:在你的听众中,在你切换之前, TextView currentStatus=(TextView) convertView.findViewById(R.id.status);
然后您用 currentStatus 替换侦听器中所有对状态的引用。而且你只需要在你的 getView 方法之外定义一次监听器,甚至在你的适配器之外,而不是在你的 listView 被定义并且你的适配器被添加到它的地方