listView.setOnItemClickListener(new OnItemClickListener() { @Override
public void onItemClick(AdapterView<?> arg0,  View arg1, int arg2,
long arg3) {
arg1.setBackgroundColor(Color.BLUE);

}
}
});listviewandroid

解决方案 »

  1.   

    是adapter的getView 复用导致的你要记录你选择的position 也就是那个args2 根据记录位置来setBackground你需要了解一下listview的 加载原理
      

  2.   

    谢谢  我刚刚看过了 但是要怎么通过args2获取那个子View来设置setBackground啊?
      

  3.   

    arg0.getchildAt(arg2) 得到的是被点击项view。
      

  4.   

    如果超出满屏,需要借用parent.getFirstVisiblePosition()确定第一项的位置做调整。
      

  5.   


    这个方法我试过啊 但是点击一个之后 背景颜色变了 但是滑动到下面 还是有其他条目的背景色也跟着变了  是不是要重写getView方法才行啊?
      

  6.   

    我的意思是 你要记录这个position 重写getView 的时候根据这个position 来确定是否改变背景
      

  7.   

    好吧 能不能贴个源码  这个getView该怎么重写 请大神赐教!
      

  8.   

    package com.example.baseadaptertest;import java.util.List;import android.content.Context;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;public class MyAdapter extends BaseAdapter {
    public Context mContext;
    public int mCount;
    private List<String> items;
    private LayoutInflater inflater;
    private int myPosition = -1;
    public MyAdapter(Context context,int count){
    mContext = context;
    mCount = count;
    }
    public MyAdapter(Context context,List<String> items){
    this.items = items;
    inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    @Override
    public int getCount() {
    // TODO Auto-generated method stub
    //return mCount;
    return items.size();
    } @Override
    public Object getItem(int position) {
    // TODO Auto-generated method stub
    return items.get(position);
    } @Override
    public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
    } @Override
    public View getView(int position, View converView, ViewGroup parent) {
    if(converView == null){
    ViewHolder holder = new ViewHolder();
    converView = inflater.inflate(R.layout.textviewlayout, null);
    holder.mImageView = (ImageView) converView.findViewById(R.id.image);
    holder.mImageView.setImageResource(R.drawable.ic_launcher);
    holder.mTextVIew = (TextView) converView.findViewById(R.id.text);
    holder.mTextVIew.setText(items.get(position));
    converView.setTag(holder);
    if(position == myPosition){
                //do what you want to do 
    }
    }else{
    ViewHolder holder = (ViewHolder) converView.getTag();
    holder.mTextVIew.setText(items.get(position));
    if(position == myPosition){
                //do what you want to do 
    }
    }
    return converView;
    }
    public class ViewHolder1{
    public TextView mTextView;
    }
    public class ViewHolder2{
    public ImageView mImageView;
    }
    public class ViewHolder{
    public TextView mTextVIew;
    public ImageView mImageView;
    }
    public void addItem(String item){
    items.add(item);
    }
        public void setPosition(int position){
    myPosition = position;//set position tag
        }
    }
    如果你需要其他功能 需要自己再实现
      

  9.   

    参见8楼的源码,你在拉动时,getview被重用了,相当于系统回收了
    拉出去的那个item,并把这个item的格式用到的新出现的item,你自己
    在getview里根据position设置背景即可。
      

  10.   

     public View getView(final int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub

     if(convertView == null){
     ViewHolder holder = new ViewHolder();
     convertView = inflater.inflate(R.layout.show_notethemetext, null);
     holder.timeTextView = (TextView) convertView.findViewById(R.id.timelist);
     holder.timeTextView.setText(list.get(position).get("timeData"));
     holder.contentTextView = (TextView) convertView.findViewById(R.id.themelist);
     holder.contentTextView.setText(list.get(position).get("themeData"));
     convertView.setTag(holder);
     for(int i = 0;i < bgClickList.size();i++){
     if(position == bgClickList.get(i).get("bg")){
     
     convertView.setBackgroundColor(Color.BLUE);
     }
     }
     }else{
     ViewHolder holder = (ViewHolder) convertView.getTag();
     holder.timeTextView.setText(list.get(position).get("timeData"));
     holder.contentTextView.setText(list.get(position).get("themeData"));
     for(int i = 0;i < bgClickList.size();i++){
     if(position == bgClickList.get(i).get("bg")){
     convertView.setBackgroundColor(Color.BLUE);
     }
     }
     }
     return convertView;
        }
    是这样子的吗?  这样还是不行啊,还是会有多个View的背景发生变化
      

  11.   

    listView里的item在点击的时候会变成黄色高亮显示,这时可以在listview里添加
    android:listSelector="@android:color/transparent"来取消黄色高亮效果.
      

  12.   

     bgClickList.get(i).get("bg") 你把这个值打印出来吧 
      

  13.   

    这个值就是我那个arg2的值啊 我就是点击一个  就把它的位置存储到ArrayList中
      

  14.   

    你输出getView的所有log 你看看 position是哪个值得时候还执行了 改变 background
      

  15.   

     public View getView(final int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub

     if(convertView == null){
     ViewHolder holder = new ViewHolder();
     convertView = inflater.inflate(R.layout.show_notethemetext, null);
     holder.timeTextView = (TextView) convertView.findViewById(R.id.timelist);
     holder.timeTextView.setText(list.get(position).get("timeData"));
     holder.contentTextView = (TextView) convertView.findViewById(R.id.themelist);
     holder.contentTextView.setText(list.get(position).get("themeData"));
     convertView.setTag(holder);

     for(int i = 0;i < bgClickList.size();i++){  
     if(position == bgClickList.get(i).get("bg")){
     Log.i("position", ""+position);
     convertView.setBackgroundColor(Color.BLUE);
     }
     }
     }else{
     ViewHolder holder = (ViewHolder) convertView.getTag();
     holder.timeTextView.setText(list.get(position).get("timeData"));
     holder.contentTextView.setText(list.get(position).get("themeData"));
     for(int i = 0;i < bgClickList.size();i++){
     if(position == bgClickList.get(i).get("bg")){
     Log.i("position", ""+position);
     convertView.setBackgroundDrawable(getResources().getDrawable(R.drawable.blueer));
     }  
     }
     }
     return convertView;
        }
    点击了坐标为2的Item 上下滑动屏幕
    07-25 23:55:06.332: I/position(4627): 2
    07-25 23:55:13.028: I/position(4627): 2
    07-25 23:55:21.942: I/position(4627): 2这个Position值应该是没问题的,会不会是convertView的问题
      

  16.   

    有个问题 我错了 convertView 这个是复用的  应该做一个判断 当position != my Position的时候 取消掉背景颜色 SORRY 
      

  17.   

    没事  这个后来我也想到的 但是还是没搞出来  这样的话 只能点击一个起作用 点击第二个的时候 刚刚被点击的Item颜色就变掉了  我想通过获取背景色还控制的  但是不知道怎么获取背景色  用convertView.getBackground()没用
      

  18.   

    那个获取的是一个drawable  我也没啥好办法了。自己努力吧,还有记住回复的时候 要用引用
      

  19.   

     public View getView(final int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub

     if(convertView == null){
     ViewHolder holder = new ViewHolder();
     convertView = inflater.inflate(R.layout.show_notethemetext, null);
     holder.timeTextView = (TextView) convertView.findViewById(R.id.timelist);
     holder.timeTextView.setText(list.get(position).get("timeData"));
     holder.contentTextView = (TextView) convertView.findViewById(R.id.themelist);
     holder.contentTextView.setText(list.get(position).get("themeData"));
     convertView.setTag(holder);

     for(int i = 0;i < bgClickList.size();i++){  
     if(position == bgClickList.get(i).get("bg")){
     Log.i("position", ""+position);
     convertView.setBackgroundDrawable(getResources().getDrawable(R.drawable.blueer));
     }else{
     boolean isPos = true;
     for(int l = 0;l < bgClickList.size();l++){
     if(bgClickList.get(l).get("bg") == position){
     convertView.setBackgroundDrawable(getResources().getDrawable(R.drawable.blueer));
     isPos = false;
     }
     }
     if(isPos){
     convertView.setBackgroundColor(Color.TRANSPARENT);
     }
    }
     }
     }else{
     ViewHolder holder = (ViewHolder) convertView.getTag();
     holder.timeTextView.setText(list.get(position).get("timeData"));
     holder.contentTextView.setText(list.get(position).get("themeData"));
     for(int i = 0;i < bgClickList.size();i++){
     if(position == bgClickList.get(i).get("bg")){
     Log.i("position", ""+position);
     convertView.setBackgroundDrawable(getResources().getDrawable(R.drawable.blueer));
     }else{
     boolean isPos = true;
     for(int l = 0;l < bgClickList.size();l++){
     if(bgClickList.get(l).get("bg") == position){
     convertView.setBackgroundDrawable(getResources().getDrawable(R.drawable.blueer));
     isPos = false;
     }
     }
     if(isPos){
     convertView.setBackgroundColor(Color.TRANSPARENT);
     }
     }  
     }
     }
     return convertView;
        }
     }