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

问题

我正在尝试使用可选项创建ListView 。 我希望能够单击ListView中的项目并让项目在列表中更改颜色,然后继续使用行中的数据执行其他操作。

我正在使用SimpleAdapter

如何制作它,以便当我点击一行时,它会变成另一种颜色,然后当我点击另一行时,选择新行并更改为新颜色,旧行变回正常?

到目前为止,这是我的代码。 DBTools类包含了我希望在ListView显示的所有数据,并将其组织起来。 getAllReceivers()方法返回一个包含所有数据的HashMapArrayList

MainActivity.java:

 public class MainActivity extends ListActivity { DBTools dbTools = new DBTools(this); ArrayList<HashMap> 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); } } } 

activity_main.xml中:

        

receiver_entry.xml

       

这个问题的解决方案非常简单。 我们需要在ListView添加一个OnItemClickListener来监听点击并做出相应的响应。

因此,在onCreate()方法中,一旦确定数据集不为空,您将要覆盖onItemClick()方法以侦听单击并更改颜色。 您还需要跟踪为后面的步骤选择的项目,因此添加public int selectionId = -1; 在你的class级顶部。 此外,您需要通过调用((SimpleAdapter) getListAdapter()).notifyDataSetChanged()ListAdapter知道您更改了某些内容。

 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 = getNewAdapter(); setListAdapter(adapter); } 

大! 现在我们有一个可以改变你点击的行颜色的工作系统。 但我们还没有完成。 我们需要确保先前的选择更改回正常颜色。

为此,我们将使用覆盖SimpleAdaptergetView()方法,每次ListView用于绘制其中显示的项目时都会调用该方法。

它实际上只显示它需要的项目 – 你可以看到的项目。 它不会渲染屏幕上方或下方的那些。 因此,如果ListView有200个项目,则一次只渲染5或6个,具体取决于屏幕大小和项目大小。

要覆盖getView()方法,请转到初始化adapter并将代码更改为:

 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; } }; 

每次绘制其中一行时,由于将调用getView()ListView将检查当前view是否具有您选择的行ID。 如果没有,它会将背景颜色更改为白色。 如果是,它会将背景颜色更改为红色。

瞧! 而已! 现在,当您单击ListView的项目时,您将背景颜色设置为红色。

最终守则

MainActivity.java:

 public class MainActivity extends ListActivity { DBTools dbTools = new DBTools(this); ArrayList> 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); } } } 

activity_main.xml中:

        

receiver_entry.xml