2013-02-27 102 views
1
list.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View view, 
      int position, long id) { 

     View v = parent.getChildAt(position); 
     TextView fileName = (TextView) v.findViewById(R.id.file_name); 
     fileName.setTextColor(Color.BLUE); 


    } 
}); 

OnItemClick(),我将项目元素的文本颜色设置为蓝色(file_name)。Android:如何永久修改ListView的子项(View) - 滚动后颜色会丢失

滚动列表视图此之后,新的颜色(蓝色)丢失(它被重置为默认颜色)

为什么?我必须以某种方式更改与ListView关联的适配器吗?

编辑:FileListAdapter(用于填充的ListView)

package com.landa.adapter; 
import java.io.File; 


public class FileListAdapter extends BaseAdapter { 
    private final Context context; 
private final File[] data; 

public FileListAdapter(Context context, File[] values) { 
    this.context = context; 
    this.data = values; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    LayoutInflater inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    View rowView = inflater.inflate(R.layout.list_row, parent, false); 

    File f = data[position]; 

    TextView textView = (TextView) rowView.findViewById(R.id.file_name); 
    TextView fullPath = (TextView) rowView.findViewById(R.id.full_path); 
    ImageView imageView = (ImageView) rowView.findViewById(R.id.file_image); 

    textView.setText(f.getName()); 
    fullPath.setText(f.getAbsolutePath()); 
    imageView.setImageResource(
      BrowseHandler.getFileIconResourceId(f.getAbsolutePath())); 

    return rowView; 

} 

public int getCount() { 
    return data.length; 
} 

public Object getItem(int position) { 
    return position; 
} 

public long getItemId(int position) { 
    return position; 
} 

}

回答

1

你不应该改变这种onClickTextView的文本颜色 - 你应该标记您的适配器范围内的项目点击 - 你如何做,取决于你。

将项目标记为点击后,您可以通知ListView数据已更改,并会刷新列表 - 在此期间,您的Adapter可以检查新点击的状态并更改颜色。 ListView

2

是的,你需要更改适配器;准确地说,你必须通过扩展ArrayAdapter来创建一个自定义的。

特别是你必须重写getView(int position, View convertView, ViewGroup parent)以显示已经点击的项目的蓝色。

相当容易,this tutorial might help,否则问。

编辑编辑编辑

试试这个方法,如果是你想要什么:

public int flag=-1;//CREATE A FLAG TO STORE THE POSITION OF THE ITEM CLICKED 

//Other stuff... 
//... 

list.setOnItemClickListener(new OnItemClickListener() { 
public void onItemClick(AdapterView<?> parent, View view, 
     int position, long id) { 

    View v = parent.getChildAt(position); 
    TextView fileName = (TextView) v.findViewById(R.id.file_name); 
    fileName.setTextColor(Color.BLUE); 
    flag=position;//WHIT THIS YOU KEEP TRACK OF THE ITEM THAT WAS CLICKED 

} 
}); 

//Other stuff... 
//... 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

LayoutInflater inflater = (LayoutInflater) context 
     .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

View rowView = inflater.inflate(R.layout.list_row, parent, false); 

File f = data[position]; 

TextView textView = (TextView) rowView.findViewById(R.id.file_name); 
TextView fullPath = (TextView) rowView.findViewById(R.id.full_path); 
ImageView imageView = (ImageView) rowView.findViewById(R.id.file_image); 

//NOW YOU CHECK IF THAT POSTION WAS THE ONE CLICKED, IT SETS THE COLOR BLUE 
if(position==flag) textView.setTextColor(Color.BLUE); 

textView.setText(f.getName()); 
fullPath.setText(f.getAbsolutePath()); 
imageView.setImageResource(
     BrowseHandler.getFileIconResourceId(f.getAbsolutePath())); 

return rowView; 

} 

所以基本上你使用:

public int flag=-1;

flag=position;

if(position==flag) textView.setTextColor(Color.BLUE);

+0

您能否再详述一下?我有我的自定义适配器,我会发布它。 – Tool 2013-02-27 12:56:46

+0

@Tool好主意让我们来看看适配器 – 2013-02-27 12:58:14

+0

根据您发布的教程,我确定了一个问题。也许我不应该一直膨胀视图,但只有当converView为空时。 – Tool 2013-02-27 13:02:40