Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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_Xml_Android Listview - Fatal编程技术网

Android 如何永久更改Listview中行的背景色?

Android 如何永久更改Listview中行的背景色?,android,xml,android-listview,Android,Xml,Android Listview,我想更改listview中某行的背景色。现在我正和你一起做这件事 public void onItemClick(AdapterView<?> parent, final View view, int position, long id) { view.setBackgroundColor(Color.parseColor("#ff0000"));//

我想更改listview中某行的背景色。现在我正和你一起做这件事

  public void onItemClick(AdapterView<?> parent, final View view,
                                int position, long id) {


        view.setBackgroundColor(Color.parseColor("#ff0000"));//                

        }
public void onItemClick(AdapterView父视图、最终视图、,
内部位置,长id){
view.setBackgroundColor(Color.parseColor(#ff0000”);//
}
这是可行的——但当我在listview上向下滚动,使背景颜色更改的行看不见,然后向上滚动时,该行的颜色不再更改


有没有一种方法可以永久设置行的背景色,这样就不会发生这种情况?

为listView定义一个适配器,将单击项目的索引值保存在内存中,并使用adapter.notifyDataSetChanged()在单击时重绘视图,根据索引值设置背景色

这里有一些示例代码可能会对您有所帮助。我只是编写java代码,没有时间完成xml文件和编写测试数据。因此,如果此代码中存在问题,请告诉我

public class TestActivity extends Activity {
  ListView listView;
  ArrayList<String> dataList;
  int selectedIndex=-1;
  TestAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test_activity);
    listView=(ListView)findViewById(R.id.listview);

    //init your dataList here
    adapter=new TestAdapter();
    listView.setAdapter(adapter);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            selectedIndex=position;
            adapter.notifyDataSetChanged();
        }
    });
}




public class TestAdapter extends BaseAdapter{

    class ViewHolder{
        TextView title;
        LinearLayout background;
    }

    @Override
    public int getCount() {
        if(null==dataList){
            return 0;
        }else{
            return dataList.size();
        }
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(null==convertView){
            convertView=getLayoutInflater().inflate(R.layout.list_test,null);
            ViewHolder holder=new ViewHolder();
            holder.title=(TextView)convertView.findViewById(R.id.title);
            holder.background=(TextView)convertView.findViewById(R.id.background);
            convertView.setTag(holder);
        }

        ViewHolder holder=(ViewHolder)convertView.getTag();
        String data=dataList.get(position);
        holder.title.setText(data);
        if(position == selectedIndex){
            holder.background.setBackgroundColor(Color.WHITE);
        }else{
            holder.background.setBackgroundColor(Color.BLUE);
        }
        return convertView;
    }
}

}
公共类测试活动扩展活动{
列表视图列表视图;
ArrayList数据表;
int selectedIndex=-1;
测试适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.test_活动);
listView=(listView)findViewById(R.id.listView);
//在这里初始化您的数据列表
适配器=newtestAdapter();
setAdapter(适配器);
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
selectedIndex=位置;
adapter.notifyDataSetChanged();
}
});
}
公共类TestAdapter扩展了BaseAdapter{
类视图持有者{
文本视图标题;
线性布局背景;
}
@凌驾
public int getCount(){
if(null==dataList){
返回0;
}否则{
返回dataList.size();
}
}
@凌驾
公共对象getItem(int位置){
返回null;
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
if(null==convertView){
convertView=GetLayoutFlater().充气(R.layout.list\u测试,空);
ViewHolder=新的ViewHolder();
holder.title=(TextView)convertView.findViewById(R.id.title);
holder.background=(TextView)convertView.findViewById(R.id.background);
convertView.setTag(支架);
}
ViewHolder=(ViewHolder)convertView.getTag();
字符串数据=dataList.get(位置);
holder.title.setText(数据);
如果(位置==所选索引){
支架。背景。背景颜色(颜色。白色);
}否则{
支架。背景。背景颜色(颜色。蓝色);
}
返回视图;
}
}
}

您需要做的是使用您自己的
行布局.xml
文件创建一个自定义的
列表视图,一个
自定义列表视图对象
,它有一个
布尔值
来检查元素是否被单击,最后一个
自定义列表视图
来检查行元素是否被选中

您的行布局
行布局.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="5dp">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="12dp"
        android:text="Large Text"
        android:id="@+id/textfield"/>

</LinearLayout>
最后,您的适配器:

public class CustomListViewAdapter extends BaseAdapter {

    private ArrayList<CustomRowClass> listData;
    private LayoutInflater layoutInflater;
    private Context context;

    public CustomListViewAdapterBallot(Context context, ArrayList<CustomRowClass> listData) {
        this.listData = listData;
        layoutInflater = LayoutInflater.from(context);
        this.context = context;
    }

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

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

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

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        if (convertView == null) {

            convertView = layoutInflater.inflate(R.layout.row_layout, null);
            holder = new ViewHolder();

            holder.input = (TextView) convertView.findViewById(R.id.textfield);

            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.textfield.setText(listData.get(position).getInput());

        //check here if state = 1 which means selected state
        if(listData.get(position).isSelected()){
            convertView.setBackgroundColor(Color.GREEN);
        }
        else{
            convertView.setBackgroundColor(Color.WHITE);
        }

        return convertView;
    }

    static class ViewHolder {
        TextView input;
    }
}
公共类CustomListViewAdapter扩展了BaseAdapter{
私有数组列表数据;
私人停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场;
私人语境;
公共CustomListViewAdapterBallot(上下文上下文,ArrayList listData){
this.listData=listData;
layoutInflater=layoutInflater.from(上下文);
this.context=上下文;
}
@凌驾
public int getCount(){
返回listData.size();
}
@凌驾
公共对象getItem(int位置){
返回listData.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
视窗座;
if(convertView==null){
convertView=LayoutFlater.充气(R.layout.row_布局,空);
holder=新的ViewHolder();
holder.input=(TextView)convertView.findViewById(R.id.textfield);
convertView.setTag(支架);
}
否则{
holder=(ViewHolder)convertView.getTag();
}
holder.textfield.setText(listData.get(position.getInput());
//如果state=1(表示所选状态),请选中此处
if(listData.get(position.isSelected()){
convertView.setBackgroundColor(颜色.绿色);
}
否则{
convertView.setBackgroundColor(颜色:白色);
}
返回视图;
}
静态类视窗夹{
文本视图输入;
}
}
就这样。要使用此功能,请按如下方式操作:

ListView sampleListView = (ListView) findViewById(R.id.listView);

//create your listView with your custom object
ArrayList<CustomRowClass> data = new ArrayList<>();


for(int i = 0 ; i < 10 ; i ++){
    CustomRowClass entry = new CustomRowClass("Name " + i, false);
    data.add(entry);
}

//create your adapter, use the nameAndAgeList ArrayList
CustomListViewAdapter customAdapter = new CustomListViewAdapter(this, data);

//get your listView and use your adapter
listView.setAdapter(sampleListView);

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        CustomRowClass selection = (CustomRowClass) listView.getItemAtPosition(position);
        selection.setSelected(true);
        adapter.notifyDataSetChanged();
    }
});
ListView sampleListView=(ListView)findViewById(R.id.ListView);
//使用自定义对象创建listView
ArrayList数据=新的ArrayList();
对于(int i=0;i<10;i++){
CustomRowClass条目=新CustomRowClass(“名称”+i,false);
数据。添加(条目);
}
//创建适配器时,请使用nameAndAgeList ArrayList
CustomListViewAdapter customAdapter=新的CustomListViewAdapter(此,数据);
//获取listView并使用适配器
setAdapter(sampleListView);
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
CustomRowClass选择=(CustomRowClass)listView.getItemAtPosition(位置);
selection.setSelected(true);
adapter.notifyDataSetChanged();
}
});

您必须实现的自定义listview适配器
ListView sampleListView = (ListView) findViewById(R.id.listView);

//create your listView with your custom object
ArrayList<CustomRowClass> data = new ArrayList<>();


for(int i = 0 ; i < 10 ; i ++){
    CustomRowClass entry = new CustomRowClass("Name " + i, false);
    data.add(entry);
}

//create your adapter, use the nameAndAgeList ArrayList
CustomListViewAdapter customAdapter = new CustomListViewAdapter(this, data);

//get your listView and use your adapter
listView.setAdapter(sampleListView);

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        CustomRowClass selection = (CustomRowClass) listView.getItemAtPosition(position);
        selection.setSelected(true);
        adapter.notifyDataSetChanged();
    }
});