问题
I use an efficientAdapter to populate mylistview as shown below:
回答1:
You can try something like this. I cleaned up and simplified your code.
public class EfficientAdapter extends BaseAdapter {
private Activity mActivity;
private ArrayList<SearchTracks> mSearchTracks;
private ResultatMultiple mResultatMultiple;
private int mSelectedPosition;
public EfficientAdapter(Activity activity, ArrayList<SearchTracks> searchTracks) {
mActivity = activity;
mSearchTracks = searchTracks;
}
public EfficientAdapter(ResultatMultiple resultatMultiple){
mResultatMultiple = resultatMultiple ;
}
public void setSelectedPosition(int position) {
mSelectedPosition = position;
}
@Override
public int getCount() {
return mSearchTracks.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
ViewHolder holder = null;
if(convertView == null) {
LayoutInflater inflater = (LayoutInflater)mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.ecran_multiple_row, null);
holder = new ViewHolder();
holder.indexTextView = (TextView)view.findViewById(R.id.txIndex);
holder.titleTextView = (TextView)view.findViewById(R.id.txSTitle);
holder.buttonOnOffImageView = (ImageView)view.findViewById(R.id.btOnOFF);
view.setTag(holder);
}else {
holder = (ViewHolder)view.getTag();
}
int index = position + 1;
holder.indexTextView.setText((index <= 9 ? "0" : "") + Integer.toString(index));
holder.titleTextView.setText(mSearchTracks.get(position).getTitle());
if(position % 2 == 0) {
view.setBackgroundResource(R.drawable.listview_selector_odd);
}else {
view.setBackgroundResource(R.drawable.listview_selector_even);
}
if(mSearchTracks.size() == 1 || position == mSelectedPosition) {
holder.buttonOnOffImageView.setBackgroundResource(R.drawable.air_radio_button_rouge);
}else {
holder.buttonOnOffImageView.setBackgroundResource(R.drawable.air_deezer_check);
}
return view;
}
private class ViewHolder {
public TextView indexTextView;
public TextView titleTextView;
public ImageView buttonOnOffImageView;
}
}
Now in your onClick listener you can call listAdapter.setSelectedPosition(position); and then listAdapter.notifyDataSetChanged(); to reload your table.
回答2:
What you can do is use setTag() and getTag() to maintain the scrolling position and have a check that your ImageView of ListView row don't inter-change the resource.
Inside your Adapter's getView() class use
vi.setTag(R.id.btOnOFF, holder.btOnOFF);
And then fetch it inside onItemClick() using getTag()
ImageView imgview = (ImageView) view.getTag(R.id.btOnOFF);
imgview.setBackgroundResource(R.drawable.air_radio_button_rouge);
For further reference you can check my blog post
来源:https://stackoverflow.com/questions/17482001/change-imageview-backgroundresource-in-listview-onitemselected-android