我如何获得Android列表视图选择器项目以记住他们的屏幕状态?

我创建了一个自定义列表视图,在每行的左侧有两个箭头(向上/向下进行投票)。 使用选择器我已经能够改变箭头的图像(颜色)并相应地更新投票。 我的问题是,如果我单击投票,例如,一旦我向下滚动足够远,以便我投票的列表项目离开屏幕,它将重置为原始的未检查状态/图像。

这是我的获取视图方法

public View getView(final int position, View convertView, ViewGroup parent) { //creating the ViewHolder we defined earlier. final ViewHolder holder = new ViewHolder(); //creating LayoutInflator for inflating the row layout. LayoutInflater inflator = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); //inflating the row layout we defined earlier. convertView = inflator.inflate(R.layout.partylist, null); //setting the views into the ViewHolder. holder.title = (TextView) convertView.findViewById(R.id.title); holder.voteUp = (ImageView) convertView.findViewById(R.id.vote_up_image); holder.voteUp.setTag(position); holder.voteDown = (ImageView) convertView.findViewById(R.id.vote_down_image); holder.voteDown.setTag(position); holder.votes = (TextView) convertView.findViewById(R.id.votes); //define an onClickListener for the ImageView. holder.voteUp.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (v.isSelected()){ v.setSelected(false); holder.votes.setText(String.valueOf((list.get(position).votes))); } else { if (holder.voteDown.isSelected()){ v.setSelected(true); holder.voteDown.setSelected(false); holder.votes.setText(String.valueOf((list.get(position).votes+1))); }else{ v.setSelected(true); } } //Toast.makeText(PartyActivity.this, "Image from row " + position + " was pressed " + list.get(position).title, Toast.LENGTH_LONG).show(); } }); holder.voteDown.setOnClickListener(new OnClickListener() { @Override public void onClick(View w) { if (w.isSelected()){ w.setSelected(false); holder.votes.setText(String.valueOf((list.get(position).votes))); } else { if (holder.voteUp.isSelected()){ w.setSelected(true); holder.voteUp.setSelected(false); holder.votes.setText(String.valueOf((list.get(position).votes-1))); }else{ w.setSelected(true); } } //Toast.makeText(PartyActivity.this, "Image from row " + position + " was pressed " + list.get(position).title, Toast.LENGTH_LONG).show(); } }); //setting data into the the ViewHolder. holder.title.setText(list.get(position).title); holder.votes.setText(String.valueOf(list.get(position).votes)); //return the row view. return convertView; } } 

我所做的是创建一个实现Checkable的自定义RelativeLayout。 我使用背景颜色标记所选项目,但您也可以使用图像:

 package com.xxx; public class DictionaryRelativeLayout extends RelativeLayout implements Checkable { public DictionaryRelativeLayout(Context context, AttributeSet attrs) { super(context, attrs); } public DictionaryRelativeLayout(Context context) { super(context); } private boolean mChecked = false; @Override public boolean isChecked() { return mChecked; } @Override public void setChecked(boolean checked) { mChecked = checked; this.setBackgroundColor(mChecked ? getResources().getColor(R.color.list_selected) : getResources().getColor(R.color.list_default)); } @Override public void toggle() { setChecked(!mChecked); } } 

当我为列表项定义布局时,我使用了RelativeLayout:

  ... the rest of the layout  

我在片段中使用我的列表,你必须定义你的列表是使用单一选择。 我在onActivityCreated中这样做:

  @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); getListView().setChoiceMode(AbsListView.CHOICE_MODE_SINGLE); } 

所以我自己弄清楚了。 这是由对教程的可怕理解引起的。

我将一个对象传递给我的自定义适配器,我所要做的就是在对象内部创建一些布尔变量来存储是否在每一行上选中了复选框/选择器,然后在单击图像时适当地设置这些变量。

对于需要帮助的人来说,这是我的新getview()

 public View getView(final int position, View convertView, ViewGroup parent) { //creating the ViewHolder we defined earlier. final ViewHolder holder = new ViewHolder(); //creating LayoutInflator for inflating the row layout. LayoutInflater inflator = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); //inflating the row layout we defined earlier. convertView = inflator.inflate(R.layout.partylist, null); //setting the views into the ViewHolder. holder.title = (TextView) convertView.findViewById(R.id.title); holder.voteUp = (CheckBox) convertView.findViewById(R.id.vote_up_image); holder.voteUp.setTag(position); holder.voteDown = (CheckBox) convertView.findViewById(R.id.vote_down_image); holder.voteDown.setTag(position); holder.votes = (TextView) convertView.findViewById(R.id.votes); //define an onClickListener for the ImageView. holder.voteUp.setOnCheckedChangeListener(new OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (holder.voteUp.isSelected()){ holder.voteUp.setSelected(false); list.get(position).Up=false; holder.votes.setText(String.valueOf((list.get(position).votes))); } else { if (holder.voteDown.isSelected()){ holder.voteUp.setSelected(true); holder.voteDown.setSelected(false); list.get(position).Up=true; list.get(position).Down=false; holder.votes.setText(String.valueOf((list.get(position).votes+1))); }else{ holder.voteUp.setSelected(true); list.get(position).Up=true; holder.votes.setText(String.valueOf((list.get(position).votes+1))); } }} }); holder.voteDown.setOnCheckedChangeListener(new OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {// Toast.makeText(PartyActivity.this, "Image from row " + position + " was pressed " + list.get(position).title, Toast.LENGTH_LONG).show(); if (holder.voteDown.isSelected()){ holder.voteDown.setSelected(false); list.get(position).Down=false; holder.votes.setText(String.valueOf((list.get(position).votes))); } else { if (holder.voteUp.isSelected()){ holder.voteDown.setSelected(true); holder.voteUp.setSelected(false); list.get(position).Down=true; list.get(position).Up=false; holder.votes.setText(String.valueOf((list.get(position).votes-1))); }else{ holder.voteDown.setSelected(true); list.get(position).Down=true; holder.votes.setText(String.valueOf((list.get(position).votes-1))); } }} }); //setting data into the the ViewHolder. holder.title.setText(list.get(position).title); holder.votes.setText(String.valueOf(list.get(position).votes)); holder.voteUp.setChecked(list.get(position).Up); holder.voteDown.setChecked(list.get(position).Down); //return the row view. return convertView; }