我有一个多选列表视图,每行有4个文本视图和1个复选框。现在,当我选择一个复选框并向下滚动时,它会随机选择另一行。例如,如果我选择第一个项目,那么当我向下滚动时,将选择屏幕上出现的第一个项目,反之亦然。
MainActivity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
final ListView lv= (ListView) findViewById(R.id.lv);
lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
Downloader d=new Downloader(MainActivity.this,urlAddress,lv);
d.execute();
}
CustomAdapter.java
public class CustomAdapter extends BaseAdapter {
Context c;
ArrayList<PlayersPool> players;
LayoutInflater inflater;
boolean[] itemChecked;
public CustomAdapter(Context c, ArrayList<PlayersPool> players) {
this.c = c;
this.players = players;
//INITIALIE
inflater= (LayoutInflater)
c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
itemChecked= new boolean[players.size()];
}
@Override
public int getCount() {
return players.size();
}
@Override
public Object getItem(int position) {
return players.get(position);
}
@Override
public long getItemId(int position) {
return players.get(position).getId();
}
@Override
public View getView(final int position, View convertView, ViewGroup
parent) {
if(convertView==null)
{
convertView=inflater.inflate(R.layout.model,parent,false);
}
final TextView nameP= (TextView)
convertView.findViewById(R.id.nameP);
TextView priceP= (TextView) convertView.findViewById(R.id.priceP);
TextView roleP= (TextView) convertView.findViewById(R.id.roleP);
TextView team= (TextView)convertView.findViewById(R.id.team_name);
final CheckBox chk= (CheckBox)convertView.findViewById(R.id.cb);
nameP.setText(players.get(position).getName());
priceP.setText(players.get(position).getPropellant()+" PKR");
roleP.setText(players.get(position).getDescription());
team.setText(players.get(position).getTeamName());
chk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String listItemText= nameP.getText().toString();
if(chk.isChecked()){
Toast.makeText(c,"Checked",Toast.LENGTH_LONG).show();
}
else
Toast.makeText(c,"Not
Checked",Toast.LENGTH_LONG).show();
}
});
}
我已经尝试了很多,但是我无法找出错误。
答案 0 :(得分:2)
ListView
–像其现代替代品RecyclerView
—回收行。当用户滚动列表时,随着行从屏幕上滚动出来,它们被getView()
重用于需要滚动到屏幕上的行。
您需要:
在某处保存有关已选中/未选中哪些项目的信息,而不是显示Toast
消息。例如,您可以使用itemChecked
数组。
在getView()
中,根据请求的项目是否已选中,每次都设置CheckBox
的选中状态(例如,在itemChecked
中查找值)
This activity演示了基本技术,尽管在我的情况下,我使用的是RatingBar
而不是CheckBox
。
答案 1 :(得分:0)
您需要根据是否应为该特定行检查复选框,在getView()中显式设置复选框的状态。
由于性能原因(滚动时,您在代码中使用convertView所做的操作),通常在滚动时会回收创建用于表示ListView元素的View,因此,当您查看时不会显式重置的任何View属性重新使用View只会保留上次使用特定View实例时的状态。