java - 滚动 ListView 时丢失项目背景颜色

标签 java android listview background listitem

我尝试使用来自 stackoverflow 的任何解决方案,但没有成功。 因此,我在单击后将背景颜色设置为项目 - 它的工作原理。滚动(当项目超出屏幕)和返回滚动(项目在屏幕中)后,该项目失去背景颜色。 这是部分代码:

public class RowAdapter extends ArrayAdapter<FileRow> {
private final Activity context;
private final List<FileRow> list;

public RowAdapter(Activity context, List<FileRow> list) {
    super(context, R.layout.browser_row, list);
    this.context = context;
    this.list = list;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
        View v = super.getView(position, convertView, parent);

        LayoutInflater inflator = context.getLayoutInflater();
        convertView = inflator.inflate(R.layout.browser_row, null);

        TextView textView = (TextView)convertView;
        textView.setText(list.get(position).GetName());
        if (!list.get(position).GetName().contains("/")) {
            textView.setPadding(5, 5, 5, 5);
            textView.setCompoundDrawablesWithIntrinsicBounds(0,0,0,0);      
        }
        for (int i=0; i<BrowserFiles.selectedItems.size(); i++) {
            if (BrowserFiles.selectedItems.get(i).GetPosition() == position) {
                v.setBackgroundColor(Color.rgb(255, 165, 0));
                break;
            }
        }

    return convertView;
}

public class BrowserFiles extends ListActivity implements OnItemClickListener {

private String lastDir = "/";
private List<FileRow> items = null;
public static List<FileRow> selectedItems;  

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.browser_files);     
    ListView lv = (ListView) findViewById(android.R.id.list);
    lv.setOnItemClickListener(this);
    Intent i = getIntent();
    lastDir = i.getStringExtra("lastDir");

    getDir(lastDir);
    selectedItems = new ArrayList<FileRow>();
}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    TextView tv = (TextView)view;
    //jedna se o soubor
    if (tv.getText().toString().toLowerCase(Locale.ENGLISH).endsWith("mp3")) {
        String item = lastDir + tv.getText().toString();

        int isInList = -1;
        for (int i=0; i < selectedItems.size(); i++) {
            if (selectedItems.get(i).GetName().compareToIgnoreCase(item) == 0) {
                isInList = i;
                break;
            }
        }

        if (isInList != -1) {
            selectedItems.get(isInList).SetSelected(false);
            selectedItems.remove(isInList);
            parent.getChildAt(position).setSelected(false);
            parent.getChildAt(position).setBackgroundColor(Color.TRANSPARENT);
        }
        else {
            selectedItems.add(new FileRow(item, true, position));
            parent.getChildAt(position).setSelected(true);              
            parent.getChildAt(position).setBackgroundColor(Color.rgb(255, 165, 0));
        }                       
    }
    //jedna se o adresar
    else {
        getDir(lastDir.compareTo("/") == 0 ? lastDir + tv.getText().toString() : lastDir + "/" + tv.getText().toString());
    }    
}

最佳答案

短期内你可以添加这一行:

    for (int i=0; i<BrowserFiles.selectedItems.size(); i++) {
        if (BrowserFiles.selectedItems.get(i).GetPosition() == position) {
            v.getBackground().mutate(); // <=======
            v.setBackgroundColor(Color.rgb(255, 165, 0));
            break;
        }
    }

有关一些解释,您可以查看 this post 中的答案。

从长远来看,您可能希望优化 getView() 以提高速度。
This is a very good training video you can watch

关于java - 滚动 ListView 时丢失项目背景颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16375532/

相关文章:

java - 将 SlidingPaneLayout 的触摸事件限制在屏幕的最左边缘

android - 从 Firebase 数据创建一个 ArrayList

android - 适用于 Android 的 Twitter Fabric 登录

android - Android Studio 中某些设备没有 Logcat 输出

javascript - 使用 Javascript 访问嵌套的 ListView 文本框

java - 如何在不为每次调用调用 JVM 的情况下从 Go 调用 java 代码?

java - 使用@PreAuthorize时的安全配置

java - 在netty中丢弃消息

java - 在 ListView 中显示图像: application may be doing too much work on its main thread

android - 反射(reflect)在其他 ListView 子布局中的 ListView 的一个子布局的更改