Java 创建具有可选行的ListView/单击时更改ListView行的背景色 问题

Java 创建具有可选行的ListView/单击时更改ListView行的背景色 问题,java,android,android-listview,selection,Java,Android,Android Listview,Selection,我正在尝试创建一个带有可选项的列表视图。我希望能够在列表视图中单击一个项目,并使该项目在列表中更改颜色,然后继续对行中的数据执行其他操作 我使用的是simpledapter 我如何使它在我点击一行时变成不同的颜色,然后当我点击另一行时,新行被选中并更改为新颜色,而旧行变回正常 代码 这是到目前为止我的代码。DBTools类将我希望显示在我的ListView中的所有数据组织起来并加以处理。getAllReceivers()方法返回包含我所有数据的HashMap的ArrayList MainActi

我正在尝试创建一个带有可选项的
列表视图。我希望能够在
列表视图中单击一个项目,并使该项目在列表中更改颜色,然后继续对行中的数据执行其他操作

我使用的是
simpledapter

我如何使它在我点击一行时变成不同的颜色,然后当我点击另一行时,新行被选中并更改为新颜色,而旧行变回正常

代码 这是到目前为止我的代码。
DBTools
类将我希望显示在我的
ListView
中的所有数据组织起来并加以处理。
getAllReceivers()
方法返回包含我所有数据的
HashMap
ArrayList

MainActivity.java:

public class MainActivity extends ListActivity {
    DBTools dbTools = new DBTools(this);

    ArrayList<HashMap<String, String>> receiverList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getActionBar().hide();
        setContentView(R.layout.activity_main);

        receiverList = dbTools.getAllReceivers();
        dbTools.close();
        ListView listView = getListView();
        if(receiverList.size() != 0) {

            SimpleAdapter adapter = new SimpleAdapter(MainActivity.this,receiverList, R.layout.receiver_entry, new String[] {"receiverId","receiverName", "fullPath"}, new int[] {R.id.receiverId, R.id.receiverName, R.id.fullPath});
            setListAdapter(adapter);
        }
    }
}
public class MainActivity extends ListActivity {
    DBTools dbTools = new DBTools(this);

    ArrayList<HashMap<String, String>> receiverList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getActionBar().hide();
        setContentView(R.layout.activity_main);

        receiverList = dbTools.getAllReceivers();
        dbTools.close();
        ListView listView = getListView();
        if(receiverList.size() != 0) {
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int index, long id) {
                    view.setBackgroundColor(Color.RED);
                    TextView receiverIdTextView = (TextView) view.findViewById(R.id.receiverId);
                    selectionId = Integer.valueOf(receiverIdTextView.getText().toString());
                    ((SimpleAdapter) getListAdapter()).notifyDataSetChanged();
                 }

            });

            SimpleAdapter adapter = new SimpleAdapter(MainActivity.this,receiverList, R.layout.receiver_entry, new String[] { "receiverId","receiverName", "fullPath"}, new int[] {R.id.receiverId, R.id.receiverName, R.id.fullPath}) {
                @Override
                public View getView (int position, View convertView, ViewGroup parent) {
                    View view = super.getView(position, convertView, parent);
                    TextView receiverIdTextView = (TextView) view.findViewById(R.id.receiverId);
                    if(receiverIdTextView.getText().toString().equals(String.valueOf(selectionId))) {
                        view.setBackgroundColor(Color.RED);
                    } else {
                        view.setBackgroundColor(Color.WHITE);
                    }
                    return view;
                }
            };
            setListAdapter(adapter);
        }
    }
}
public类MainActivity扩展了ListActivity{
DBTools DBTools=新的DBTools(本);
ArrayList接管人名单;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
getActionBar().hide();
setContentView(R.layout.activity_main);
receiverList=dbTools.getAllReceivers();
dbTools.close();
ListView ListView=getListView();
如果(receiverList.size()!=0){
SimpleAdapter=new SimpleAdapter(MainActivity.this,receiverList,R.layout.receiver_条目,新字符串[]{“receiverId”,“receiverName”,“fullPath”},新int[]{R.id.receiverId,R.id.receiverName,R.id.fullPath});
setListAdapter(适配器);
}
}
}
activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TableRow
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/black" >

        <TextView
            android:id="@+id/titleTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:text="My List" />

    </TableRow>

        <ListView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/black"
            android:id="@android:id/list" />

</TableLayout>
<?xml version="1.0" encoding="utf-8"?>

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TableRow
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/black" >

        <TextView
            android:id="@+id/titleTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:text="My List" />

    </TableRow>

        <ListView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/black"
            android:id="@android:id/list" />
</TableLayout>

receiver_entry.xml

<?xml version="1.0" encoding="utf-8"?>
<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/tableRow" >

    <TextView
        android:id="@+id/receiverId"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:visibility="gone" />

    <TextView
        android:id="@+id/receiverName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Robotronics" />

    <TextView
        android:id="@+id/fullPath"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="123.45.678.910:8088/robtrox/find" />


</TableRow>
<?xml version="1.0" encoding="utf-8"?>
<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/tableRow" >

    <TextView
        android:id="@+id/receiverId"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:visibility="gone" />

    <TextView
        android:id="@+id/receiverName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Robotronics" />

    <TextView
        android:id="@+id/fullPath"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="123.45.678.910:8088/robtrox/find" />

</TableRow>

解决方案 这个问题的解决办法很简单。我们需要在
列表视图
中添加一个
监听器
,以监听点击并做出相应的响应

因此,在
onCreate()
方法中,一旦确保数据集不是空的,就需要覆盖
onItemClick()
方法来侦听单击并更改颜色。您还需要跟踪为后面的步骤选择的项目,因此添加
public int selectionId=-1在你的班级中名列前茅。此外,您需要通过调用
((SimpleAdapter)getListAdapter()).notifyDataSetChanged()
列表适配器知道您更改了某些内容

每次绘制一行时,由于将调用
getView()
,因此
ListView
将检查当前
视图是否具有所选行的id。如果没有,它会将背景颜色更改为白色。如果是,它会将背景颜色更改为红色

瞧!就这样!现在,当您单击
列表视图中的项目时,您将背景色设置为红色

最终代码 MainActivity.java:

public class MainActivity extends ListActivity {
    DBTools dbTools = new DBTools(this);

    ArrayList<HashMap<String, String>> receiverList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getActionBar().hide();
        setContentView(R.layout.activity_main);

        receiverList = dbTools.getAllReceivers();
        dbTools.close();
        ListView listView = getListView();
        if(receiverList.size() != 0) {

            SimpleAdapter adapter = new SimpleAdapter(MainActivity.this,receiverList, R.layout.receiver_entry, new String[] {"receiverId","receiverName", "fullPath"}, new int[] {R.id.receiverId, R.id.receiverName, R.id.fullPath});
            setListAdapter(adapter);
        }
    }
}
public class MainActivity extends ListActivity {
    DBTools dbTools = new DBTools(this);

    ArrayList<HashMap<String, String>> receiverList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getActionBar().hide();
        setContentView(R.layout.activity_main);

        receiverList = dbTools.getAllReceivers();
        dbTools.close();
        ListView listView = getListView();
        if(receiverList.size() != 0) {
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int index, long id) {
                    view.setBackgroundColor(Color.RED);
                    TextView receiverIdTextView = (TextView) view.findViewById(R.id.receiverId);
                    selectionId = Integer.valueOf(receiverIdTextView.getText().toString());
                    ((SimpleAdapter) getListAdapter()).notifyDataSetChanged();
                 }

            });

            SimpleAdapter adapter = new SimpleAdapter(MainActivity.this,receiverList, R.layout.receiver_entry, new String[] { "receiverId","receiverName", "fullPath"}, new int[] {R.id.receiverId, R.id.receiverName, R.id.fullPath}) {
                @Override
                public View getView (int position, View convertView, ViewGroup parent) {
                    View view = super.getView(position, convertView, parent);
                    TextView receiverIdTextView = (TextView) view.findViewById(R.id.receiverId);
                    if(receiverIdTextView.getText().toString().equals(String.valueOf(selectionId))) {
                        view.setBackgroundColor(Color.RED);
                    } else {
                        view.setBackgroundColor(Color.WHITE);
                    }
                    return view;
                }
            };
            setListAdapter(adapter);
        }
    }
}
public类MainActivity扩展了ListActivity{
DBTools DBTools=新的DBTools(本);
ArrayList接管人名单;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
getActionBar().hide();
setContentView(R.layout.activity_main);
receiverList=dbTools.getAllReceivers();
dbTools.close();
ListView ListView=getListView();
如果(receiverList.size()!=0){
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView AdapterView、视图视图、整型索引、长id){
视图.setBackgroundColor(颜色.红色);
TextView receiverId TextView=(TextView)view.findViewById(R.id.receiverId);
selectionId=Integer.valueOf(receiverIdTextView.getText().toString());
((SimpleAdapter)getListAdapter()).notifyDataSetChanged();
}
});
SimpleAdapter=new SimpleAdapter(MainActivity.this,receiverList,R.layout.receiver_条目,新字符串[]{“receiverId”,“receiverName”,“fullPath”},新int[]{R.id.receiverId,R.id.receiverName,R.id.fullPath}){
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=super.getView(位置、转换视图、父级);
TextView receiverId TextView=(TextView)view.findViewById(R.id.receiverId);
if(receiverIdTextView.getText().toString().equals(String.valueOf(selectionId))){
视图.setBackgroundColor(颜色.红色);
}否则{
视图.setBackgroundColor(颜色.白色);
}
返回视图;
}
};
setListAdapter(适配器);
}
}
}
activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TableRow
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/black" >

        <TextView
            android:id="@+id/titleTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:text="My List" />

    </TableRow>

        <ListView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/black"
            android:id="@android:id/list" />

</TableLayout>
<?xml version="1.0" encoding="utf-8"?>

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TableRow
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/black" >

        <TextView
            android:id="@+id/titleTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:text="My List" />

    </TableRow>

        <ListView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/black"
            android:id="@android:id/list" />
</TableLayout>

receiver_entry.xml

<?xml version="1.0" encoding="utf-8"?>
<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/tableRow" >

    <TextView
        android:id="@+id/receiverId"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:visibility="gone" />

    <TextView
        android:id="@+id/receiverName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Robotronics" />

    <TextView
        android:id="@+id/fullPath"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="123.45.678.910:8088/robtrox/find" />


</TableRow>
<?xml version="1.0" encoding="utf-8"?>
<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/tableRow" >

    <TextView
        android:id="@+id/receiverId"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:visibility="gone" />

    <TextView
        android:id="@+id/receiverName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Robotronics" />

    <TextView
        android:id="@+id/fullPath"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="123.45.678.910:8088/robtrox/find" />

</TableRow>