Java 活动启动时SingleChoice ListView的SetChecked单选按钮
我一直在努力创建一个由自定义ArrayAdapter填充的单选ListView(可以正常工作),但我需要在活动启动时将ListView中的预定义单选按钮设置为Java 活动启动时SingleChoice ListView的SetChecked单选按钮,java,android,listview,android-listview,Java,Android,Listview,Android Listview,我一直在努力创建一个由自定义ArrayAdapter填充的单选ListView(可以正常工作),但我需要在活动启动时将ListView中的预定义单选按钮设置为setChecked(true) 我正在用一个Listservers对象填充我的列表视图,该对象包含一个布尔值“default\u server”,用于确定哪个行/单选按钮应setChecked(true) 在活动正确启动后选择各种ListView项目,会根据需要在单选模式中将特定单选按钮标记为setChecked(true) 我的代码:
setChecked(true)
我正在用一个List
servers对象填充我的列表视图,该对象包含一个布尔值“default\u server”,用于确定哪个行/单选按钮应setChecked(true)
在活动正确启动后选择各种ListView项目,会根据需要在单选模式中将特定单选按钮标记为setChecked(true)
我的代码:
ServerActivity.java
public class ServersActivity extends FragmentActivity
//FragmentActivity needed to display dialog fragment when ListView item clicked
...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.server_list);
servers = getServers();
lv = (ListView) findViewById(android.R.id.list);
lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
adapter = new ServerActivityArrayAdapter(this, R.layout.server_list_item, servers);
lv.setAdapter(adapter);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// show dialog if not long clicked
if (!longClicked) {
lv.setItemChecked(position, true);
showServerDialog(position);
}
}
});
}
public class ServerActivityArrayAdapter extends ArrayAdapter<Server> {
private int layout;
private int mSelectedPosition = -1;
private RadioButton mSelectedRB;
private static LayoutInflater inflater;
public ServerActivityArrayAdapter(Context context, int layout, List<Server> servers) {
super(context, layout, servers);
ListArrays listArrays = new ListArrays(context);
this.layout = layout;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
private static class ServerViewHolder {
private TextView textView;
private RadioButton radioButton;
public ServerViewHolder() {
// EMPTY DEFAULT CONSTRUCTOR
}
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final Server server = this.getItem(position);
final ServerViewHolder viewHolder;
if (convertView == null) {
convertView = inflater.inflate(layout, parent, false);
viewHolder = new ServerViewHolder();
viewHolder.textView = (TextView) convertView.findViewById(R.id.tvServerName);
viewHolder.radioButton = (RadioButton) convertView.findViewById(R.id.rbDefault);
convertView.setTag(viewHolder);
} else {
viewHolder = (ServerViewHolder) convertView.getTag();
}
// TODO: SET THE DEFAULT SERVER
viewHolder.radioButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (position != mSelectedPosition && mSelectedRB != null) {
mSelectedRB.setChecked(false);
}
mSelectedPosition = position;
notifyDataSetChanged();
mSelectedRB = (RadioButton) v;
server.setDefaultServer(mSelectedRB.isChecked());
}
});
if (mSelectedPosition != position) {
viewHolder.radioButton.setChecked(false);
} else {
viewHolder.radioButton.setChecked(true);
if (mSelectedRB != null && viewHolder.radioButton != mSelectedRB) {
mSelectedRB = viewHolder.radioButton;
}
}
viewHolder.textView.setText(server.getName());
return convertView;
}
}
public class ServersActivity扩展了FragmentActivity
//碎片单击ListView项时显示对话框碎片所需的活动
...
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.server_列表);
servers=getServers();
lv=(ListView)findViewById(android.R.id.list);
lv.setChoiceMode(ListView.CHOICE\u MODE\u SINGLE);
adapter=new ServerActivityArrayAdapter(此,R.layout.server\u列表\u项,服务器);
低压设置适配器(适配器);
lv.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
//如果未长时间单击,则显示对话框
如果(!longClicked){
lv.setItemChecked(位置,真);
显示服务器对话框(位置);
}
}
});
}
ServerActivityArrayAdapter.java
public class ServersActivity extends FragmentActivity
//FragmentActivity needed to display dialog fragment when ListView item clicked
...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.server_list);
servers = getServers();
lv = (ListView) findViewById(android.R.id.list);
lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
adapter = new ServerActivityArrayAdapter(this, R.layout.server_list_item, servers);
lv.setAdapter(adapter);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// show dialog if not long clicked
if (!longClicked) {
lv.setItemChecked(position, true);
showServerDialog(position);
}
}
});
}
public class ServerActivityArrayAdapter extends ArrayAdapter<Server> {
private int layout;
private int mSelectedPosition = -1;
private RadioButton mSelectedRB;
private static LayoutInflater inflater;
public ServerActivityArrayAdapter(Context context, int layout, List<Server> servers) {
super(context, layout, servers);
ListArrays listArrays = new ListArrays(context);
this.layout = layout;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
private static class ServerViewHolder {
private TextView textView;
private RadioButton radioButton;
public ServerViewHolder() {
// EMPTY DEFAULT CONSTRUCTOR
}
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final Server server = this.getItem(position);
final ServerViewHolder viewHolder;
if (convertView == null) {
convertView = inflater.inflate(layout, parent, false);
viewHolder = new ServerViewHolder();
viewHolder.textView = (TextView) convertView.findViewById(R.id.tvServerName);
viewHolder.radioButton = (RadioButton) convertView.findViewById(R.id.rbDefault);
convertView.setTag(viewHolder);
} else {
viewHolder = (ServerViewHolder) convertView.getTag();
}
// TODO: SET THE DEFAULT SERVER
viewHolder.radioButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (position != mSelectedPosition && mSelectedRB != null) {
mSelectedRB.setChecked(false);
}
mSelectedPosition = position;
notifyDataSetChanged();
mSelectedRB = (RadioButton) v;
server.setDefaultServer(mSelectedRB.isChecked());
}
});
if (mSelectedPosition != position) {
viewHolder.radioButton.setChecked(false);
} else {
viewHolder.radioButton.setChecked(true);
if (mSelectedRB != null && viewHolder.radioButton != mSelectedRB) {
mSelectedRB = viewHolder.radioButton;
}
}
viewHolder.textView.setText(server.getName());
return convertView;
}
}
公共类ServerActivityArrayAdapter扩展了ArrayAdapter{
专用int布局;
private int mSelectedPosition=-1;
专用单选按钮mSelectedRB;
私人静电充气机;
公共服务器ActivityArrayAdapter(上下文上下文、int布局、列表服务器){
超级(上下文、布局、服务器);
ListArrays ListArrays=新的ListArrays(上下文);
this.layout=布局;
充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
}
私有静态类ServerViewHolder{
私有文本视图文本视图;
专用单选按钮单选按钮;
公共服务器视图持有者(){
//空默认构造函数
}
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
最终服务器=this.getItem(位置);
最终服务器视图持有者视图持有者;
if(convertView==null){
convertView=充气机。充气(布局,父级,假);
viewHolder=新服务器viewHolder();
viewHolder.textView=(textView)convertView.findViewById(R.id.tvServerName);
viewHolder.radioButton=(radioButton)convertView.findViewById(R.id.rbDefault);
convertView.setTag(viewHolder);
}否则{
viewHolder=(ServerViewHolder)convertView.getTag();
}
//TODO:设置默认服务器
viewHolder.radioButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(position!=mSelectedPosition&&mSelectedRB!=null){
mSelectedRB.setChecked(false);
}
mSelectedPosition=位置;
notifyDataSetChanged();
mSelectedRB=(单选按钮)v;
setDefaultServer(mSelectedRB.isChecked());
}
});
如果(mSelectedPosition!=位置){
viewHolder.radioButton.setChecked(假);
}否则{
viewHolder.radioButton.setChecked(真);
if(mSelectedRB!=null&&viewHolder.radioButton!=mSelectedRB){
mSelectedRB=viewHolder.radioButton;
}
}
viewHolder.textView.setText(server.getName());
返回视图;
}
}
同样,我的列表
服务器对象正在填充ListView,随后的对话框弹出窗口(当单击一行时)正确,并且每行上的单选按钮当前以单选模式运行。我正在使用server.setDefaultServer(mSelectedRB.isChecked())在ServerActivityArrayAdapter的setOnClickListener中选择code>,以更新哪个服务器具有默认服务器(true)
到目前为止,我在ServerActivityArrayAdapter中尝试的一切似乎都打破了单选按钮的单选模式要求。我该如何解决这个问题?我确实按照Mridul的建议返回并在我的项目中实现了共享首选项,但解决方案实际上并不需要它们 基本上,我更新了ServerActivityArrayAdapter类的构造函数,以便在创建ServerActivity类时从中传递默认服务器的ID。此外,我还设置了mselectionposition=defServer,以便在所有内容都已充气时检查ListView中的正确单选按钮
public ServerActivityArrayAdapter(Context context, int layout, List<Server> servers, int defServer) {
super(context, layout, servers);
ListArrays listArrays = new ListArrays(context);
this.layout = layout;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mSelectedPosition = defServer;
}
公共服务器ActivityArrayAdapter(上下文上下文、int布局、列表服务器、int defServer){
超级(上下文、布局、服务器);
ListArrays ListArrays=新的ListArrays(上下文);
this.layout=布局;
充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
mSelectedPosition=defServer;
}