Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何设置特定项目的背景色或可绘制颜色,以及何时滚动listview以保留这些颜色_Android - Fatal编程技术网

Android 如何设置特定项目的背景色或可绘制颜色,以及何时滚动listview以保留这些颜色

Android 如何设置特定项目的背景色或可绘制颜色,以及何时滚动listview以保留这些颜色,android,Android,我有一个列表视图,其中填充了50个项目。 这是我用于ArrayAdapter的xml <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/text1" android:layout_width="fill_parent" android:layout_height="w

我有一个列表视图,其中填充了50个项目。 这是我用于ArrayAdapter的xml

<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:gravity="center_vertical"
android:paddingLeft="6dip"
android:minHeight="?android:attr/listPreferredItemHeight"
android:background="@drawable/listview_background"
android:textColor="#ff000000">
</TextView>
要将字符串[]项中的字符串添加到列表中,我使用for循环遍历字符串数组,并使用命令list.add(items.get(I))将每个字符串添加到列表中;这里我是我的for循环计数器

for(int i=0;i<items.size();i++){
list.add(items.get(i));
}

在onListItemClick函数中,copyitems是我声明为全局变量的ArrayAdapter变量。因此,这个函数的作用是存储listview中所选项目的文本,以便稍后我可以复制所选文本。因此,如果选择一个项目,它的文本将添加到copyitems,如果选择相同的项目,它将从copyitems中删除。每次将项目添加到copyitems时,该项目的背景都会变为灰色,如果从copyitems中删除了项目,则该项目的背景会恢复为原始背景。所有这些都很好。但是当我有很多项目(比如50个)时,它们并不都适合屏幕,所以如果我想选择一个不在屏幕上的项目,那么我必须向下或向上滚动才能找到该项目。最重要的是,当我从一个选定的项目滚动并返回到它的背景变化为原始和不同的项目有灰色背景。因此,基本上,如果我的屏幕适合10个项目,我选择第一个项目,然后滚动选择通过10的其他项目(例如11)。当第一个项目离开屏幕,11个项目进来时,它已经是灰色的,但我没有选择。当我向上滚动查看第一项时,背景可能是灰色的,也可能不是灰色的。如果不是灰色,则其他项目的背景设置为灰色,如第二个项目。发生这种情况是因为项目在离开屏幕时被回收,并且因此项目的位置发生变化吗?如果是,我如何才能禁用它,这样,如果我选择了那个项目,我只有灰色背景的项目。如果有更好的方法来实现我的目标,请告诉我。我不熟悉安卓系统

您应该编写自己的适配器。我建议您从
BaseAdapter
扩展。代码如下所示:

// These are members of your activity
private List<String> mList = null;
private int mNewlyAddedItem;

private class Adapter extends BaseAdapter {

    @Override
    public int getCount() {
        return mList.size();
    }

    @Override
    public Object getItem(int position) {
        return mList.get(position);
    }

    @Override
    public long getItemId(int position) {

        return (long)position;
    }

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

        if(position == mNewlyAddedItem) {
            convertView.setBackgroundColor(Color.GRAY);
        } else {
            convertView.setBackgroundResource(R.drawable.listview_background);
        }

        // Set text to our TextView
        TextView nameText = (TextView)convertView.findViewById(R.id.text1);
        nameText.setText(mList.get(position));

        return convertView;
    }

}

我希望我正确理解了你的任务。无论如何,您已经明白了要点:您应该更改适配器代码以基于某些状态绘制视图(您可以使用
Activity
成员变量设置这些状态),更改状态后视图将更新(您还可以调用
getListView().invalidateViews()
以强制重画所有视图(如果在某个点上没有重画).

如何使用适配器类。我在代码中添加了,但不知道如何使用它。我是否编写setListAdapter(新适配器());?如何将ArrayList列表发送给它?不要将该适配器称为“适配器”。因为
Adapter
是一个Android界面。不要把你的名单称为“名单”。我的代码只是一个示例,它没有正确的命名,因为我不知道您的任务。如果您的字符串是动物的名称,我会将适配器称为“AnimalAdapter”。至于如何使用它,
setListAdapter(newadapter())
是正确的方法(在
onCreate()
handler中)。我假设此适配器是活动的内部类,因此它可以访问活动的成员,如
private ArrayList list
。同样,如果它代表动物,我会称之为“动物主义者”。
for(int i=0;i<items.size();i++){
list.add(items.get(i));
}
public void onListItemClick(ListView parent, View v, int position, long id) {
String Select = this.getListAdapter().getItem(position).toString();
if(copyitems.contains(Select)){
        v.setBackgroundResource(R.drawable.listview_background);
    copyitems.remove(Select);
}else{
    copyitems.add(Select);
    v.setBackgroundColor(Color.GRAY);
}       
}
// These are members of your activity
private List<String> mList = null;
private int mNewlyAddedItem;

private class Adapter extends BaseAdapter {

    @Override
    public int getCount() {
        return mList.size();
    }

    @Override
    public Object getItem(int position) {
        return mList.get(position);
    }

    @Override
    public long getItemId(int position) {

        return (long)position;
    }

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

        if(position == mNewlyAddedItem) {
            convertView.setBackgroundColor(Color.GRAY);
        } else {
            convertView.setBackgroundResource(R.drawable.listview_background);
        }

        // Set text to our TextView
        TextView nameText = (TextView)convertView.findViewById(R.id.text1);
        nameText.setText(mList.get(position));

        return convertView;
    }

}
public void onListItemClick(ListView parent, View v, int position, long id) {
    String Select = this.getListAdapter().getItem(position).toString();
    if(copyitems.contains(Select)){
        copyitems.remove(Select);
        mNewlyAddedItem = -1;
    }else{
        copyitems.add(Select);
        mNewlyAddedItem = position;
    }       
}
mNewlyAddedItem = position;