比方说,我的手机屏幕上的ListView一共可以显示15行,我如果选中第1行,那么第1行的背景颜色被改变,但第16行也被改变了,求解啊,我改变背景的代码如下:
private View oldLinearLayout;
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> paramAdapterView,
View paramView, int paramInt, long paramLong) {

if (beforeLinearLayout != null) {
oldLinearLayout.setBackgroundDrawable(null);
}

paramView.setBackgroundColor(Color.GREEN);
oldLinearLayout= paramView;
}
});

解决方案 »

  1.   

    getview 的时候。。同个view对象被复用了。。加个判断区别一下就可以了。
      

  2.   


    http://bbs.csdn.net/topics/390431893
      

  3.   

    那个没看懂,用我的方法不行的吗,我上面写错了,if里面是oldLinearLayout!=null
      

  4.   

    记录position 然后 变色的时候对比 position  这个 是因为 baseAdapter 服用view 的原因
      

  5.   

    大概的思路:1. choose时保存下当前的selection,然后通知adapter去刷新view2. 然后在getView根据当前的selection去填充当前的View
    //Adapter中
    public void setSelected(int selected) {
    this.selected = selected;
    notifyDataSetChanged();
    }
    //OnItemClick时
             adapter.setSelected(position);
      

  6.   

    this.selected这个是什么啊,我没有继承Adapter啊,也没有setSelected这个方法啊
    我是这么写的:
    SimpleAdapter listItemAdapter = new SimpleAdapter(this, listdata,R.layout.list_salesck, 
    new String[] { "billdate", "state","zhaiyao", "billname", "userfullname" }, 
    new int[] {R.id.billdate, R.id.textView14, R.id.zhaiyao,R.id.billtype, R.id.userfullname });listView.setAdapter(listItemAdapter);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    public void onItemClick(AdapterView<?> paramAdapterView,
               View paramView, int paramInt, long paramLong) {
    if (oldLinearLayout != null) {
    oldLinearLayout.setBackgroundDrawable(null);
    }
    // 把这次的背景颜色设置成员灰色
    paramView.setBackgroundColor(Color.GRAY);
    nowClick = paramInt;
    oldLinearLayout = paramView;
    }
    });我应该怎么加啊,跪求具体的代码
      

  7.   

    //Adapter中
            private int selected ;
    public void setSelected(int selected) {
    this.selected = selected;
    notifyDataSetChanged();
    }        //在getView 判断当前的position 是否是selected中的
            if( position == selected){
                   // 按压背景
             }else{
                   // 正常背景
             }
    //在Activity页面回调OnItemClickListener时
             adapter.setSelected(position);
      

  8.   

    Adapter中是哪里啊,我没有这个类啊
      

  9.   

    直接为ListItem加一个xml的背景就好了,程序里实现太麻烦,效果也不好。
      

  10.   

    ListView在滚动的过程中错位了
    用ViewHolder来解决
    比如:
    getView……
    {
    ViewHolder holder;
    if (null == convertView) {
      convertView = LayoutInflater.from(RewardActivity.this).inflate(
      R.layout.reward_cions_item, null);
    convertView = inflater.inflate(R.layout.reward_cions_item, null);
    holder = new ViewHolder();
    holder.time = (TextView) convertView.findViewById(R.id.time);
    convertView.setTag(holder);
    } else {
    holder = (ViewHolder) convertView.getTag();
    }
    holder.time.setText("11");
    return convertView;
    }

    class ViewHolder 
    {
    TextView time;
                ……
    }
      

  11.   


    1. 使用ViewHolder模式 作用是避免重复初始化View ,当然更合适的做法是在ViewHolder内做是否当前选中的判断,做背景的更换,2. LZ 对Adapter适配器类不是很了解, 建议先去 先去了解下 BaseAdapter这个类, 上面的code中的adapter,是一个具体的 BaseAdapter的子类的实例类 , 你应该去实现这个Adapter实例类 ,作为数据源给布局提供数据我贴一段我的code 你可以参考一下解决这个问题
    import java.util.List;import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;import com.ishow.funnymap.bean.Menu;
    import com.ishow.funnymap.ui.R;public class MenuGridViewAdapter extends BaseAdapter { private Context context;
    private List<Menu> menuGridViewList;
    private int selected; public MenuGridViewAdapter(Context context, List<Menu> menuGridViewList) {
    this.context = context;
    this.menuGridViewList = menuGridViewList;
    } // 设置当前的选择状态
    public void setSelected(int selected) {
    this.selected = selected;
    notifyDataSetChanged();
    } @Override
    public int getCount() {
    return menuGridViewList.size();
    } @Override
    public Object getItem(int position) {
    return menuGridViewList.get(position);
    } @Override
    public long getItemId(int position) {
    return 0;
    } @Override
    public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null;
    if (convertView == null) {
    convertView = inflateView();
    }
    viewHolder = (ViewHolder) convertView.getTag();
    viewHolder.init(convertView);
    viewHolder.fillFromItem(position, selected == position);
    return convertView;
    } private View inflateView() {
    LayoutInflater inflater = (LayoutInflater) context
    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(R.layout.switch_pull_down_menu_item, null);
    view.setTag(new ViewHolder());
    return view;
    } class ViewHolder {
    ImageView imageView;
    TextView textView; public void init(View view) {
    imageView = (ImageView) view.findViewById(R.id.menu_ico);
    textView = (TextView) view.findViewById(R.id.menu_description);
    } public void fillFromItem(int position, boolean isCurrent) {
    if (isCurrent) {
    imageView.setBackgroundResource(menuGridViewList.get(position)
    .getImageResNormal());
    } else {
    imageView.setBackgroundResource(menuGridViewList.get(position)
    .getImageResPressed());
    }
    textView.setText(menuGridViewList.get(position).getTextName());
    } }
    }
    OnItemClick EventmenuGridView.setOnItemClickListener(new OnItemClickListener() { @Override
    public void onItemClick(AdapterView<?> parent, View view,
    int position, long id) {
    onMenuSelectedListener.onMenuSelected(menuGridViewAdapter
    .getItem(position));
    menuGridViewAdapter.setSelected(position);
    // dismiss();
    }
    });