我正在尝试创建ListView
带有可选项目的。我希望能够单击中的一个项目,ListView
并使该项目在列表中更改颜色,然后继续对行中的数据进行其他处理。
我正在使用SimpleAdapter
。
如何做到这一点,以便当我点击一行时,它会变成不同的颜色,然后当我点击另一行时,新的行被选中并更改为新的颜色,而旧的行又变回普通颜色。 ?
到目前为止,这是我的代码。该DBTools
班是有所有的数据,我想显示在我的ListView
组织和照顾。该getAllReceivers()
方法返回ArrayList
,HashMap<String, String>
其中包含我所有数据的。
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);
}
}
}
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>
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>
解决这个问题的方法非常简单。我们需要添加一个OnItemClickListener
来ListView
监听点击并做出相应的响应。
因此,在该onCreate()
方法中,一旦确保数据集不为空,就将要重写该onItemClick()
方法以侦听单击并更改颜色。您还将要跟踪后面的步骤中选择了哪个项目,因此请public int selectionId = -1;
在课程顶部添加。此外,您需要ListAdapter
通过致电告知您已更改了某些内容((SimpleAdapter) getListAdapter()).notifyDataSetChanged()
。
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);
}
大!现在,我们有了一个可以更改您点击的行的颜色的工作系统。但是我们还没有完成。我们需要确保先前的选择变回正常颜色。
对于这一点,我们将使用替代的SimpleAdapter
的getView()
方法,这就是所谓的每次ListView
进入画显示在它的项目。
它实际上只显示需要的项目-
您可以看到的项目。它不会渲染屏幕上方或下方的内容。因此,如果您在中有200个项目,则一次ListView
只能渲染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<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);
}
}
}
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>
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>
我有一个自定义列表视图的应用程序,它有一个textview和一个imageview。当我点击图像视图时,背景颜色应该改变。我试图这样做,但是得到了。。。这是我的密码 CustomListViewAdapter。JAVA 任何建议都将不胜感激。谢谢
我有一个多栏的列表视图。。。要更改选定或单击的行项目的背景色。参考了关于stackoverflow的各种文章,但它们似乎没有帮助。。。我在McClick做的是。挫折背景色。当应用程序重新启动时,无法使用选择器,因为我希望记住我已更改颜色的行的颜色更改。。。我把标志值放在数据库中,可以在getView中设置颜色,但是第一次怎么做呢?这是代码。。。。。 我现在所做的是在getView方法中,将转换视图
我有一个FragmentActivity,它可以包含用户想要的任意多个ListFragments。ListFragments在HorizontalScrollView中并排排列(在ActionBar中选择一个选项时)。每个ListFragment项都包含一个TextView和一个按钮。单击按钮可更改按钮的ViewParent(包含按钮和TextView的线性布局)的背景色。 现在,单击每个List
你能帮帮我吗。我需要更改我的列表视图项目的背景色,该项目由setSelection(int pos)功能手动选择,我需要保留新颜色,直到调用新的setSelection。我读过一些关于如何做到这一点的主题,但仍然没有成功。谢谢
问题内容: 我有一个3列的JTable。我已经为所有3列设置了这样的代码(也许不是很有效?)。 在一个随机的背景颜色为每一行返回一个组件。 程序运行时如何将背景更改为其他随机颜色? 问题答案: 一种方法是存储模型中每一行的当前颜色。这是一个固定在3列3行的简单模型: 注意通话; 这将导致仅更新表的该行。 渲染器可以从表中获取模型: 更改行的颜色很简单:
我有一个列表视图。我想为listView项设置边框,所以我使用“Shape”XML。 shape_panel_drawable.xml文件 谢谢!