当我滚动列表时,如何保持 ListView 中的项目(如所选项目)的状态?
How can I keep the state in an item from a ListView (like the item selected) when I scroll the list?
我的列表视图有问题;我在两个片段中创建了两个 ListView 以在相同的布局中显示它们
并且当我select左侧ListView中的一个项目时,会根据selected的项目自动刷新右侧ListView。
问题是,当我 select 右侧 ListView 中的一个项目时,它会将颜色更改为绿色,这没关系,因为我以这种方式编程,如果我 select 另一个项目,它必须更改为也是绿色,并保留第一个 selected 项目的原始颜色,如下图
所示
但是当我将左侧的 ListView 滚动到 select 另一个项目时,我 return 到列表的顶部,项目 selected 的状态已经消失,因为我在下面显示
The new view, without keep the state selected
我知道原因是因为列表视图回收了它的项目视图,但我已经尝试了很多方法来尝试保持状态,无论我是否滚动列表,但我无法实现这个目标。
在这一点上,我不知道我必须从我的代码中更改什么;我给你看重要的部分;如果您需要更多信息或我的代码中的更多信息,请告诉我。
ListItem 的构造函数:
public class Lista_Item {
private String color, texto;
private String textoSuperior, textoInferior;
boolean seleccionado = false;
public Lista_Item(String color, String textoSuperior, String textoInferior, boolean seleccionado) {
// TODO Auto-generated constructor stub
this.color = color;
this.textoSuperior = textoSuperior;
this.textoInferior = textoInferior;
this.seleccionado = seleccionado;
}
public Lista_Item(String color, String texto) {
// TODO Auto-generated constructor stub
this.color = color;
this.texto = texto;
}
public String getTextoSuperior() {
return textoSuperior;
}
public String getTextoInferior() {
return textoInferior;
}
public boolean getSeleccionado() {
return seleccionado;
}
public String getTexto() {
return texto;
}
public String getColor() {
return color;
}
public void setSeleccionado(boolean seleccionado) {
this.seleccionado = seleccionado;
}
}
适配器:
private class ListAdapter extends ArrayAdapter<Lista_Item> {
private int mResourceId = 0;
private LayoutInflater mLayoutInflater;
public ListAdapter(Context context, int resource, int textViewResourceId, ArrayList<Lista_Item> listaItem) {
super(context, resource, textViewResourceId, listaItem);
mResourceId = resource;
mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = mLayoutInflater.inflate(mResourceId, parent, false);
holder = new ViewHolder();
holder.name = (TextView) convertView.findViewById(R.id.tvItemListaColor);
holder.l = (LinearLayout)convertView.findViewById(R.id.layoutColor);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
Lista_Item pedido = listItems.get(position);
holder.name.setText(pedido.getTexto());
holder.l.setBackgroundColor(Color.parseColor(pedido.getColor()));
holder.name.setTag(pedido);
return convertView;
}
private class ViewHolder {
TextView name;
LinearLayout l;
}
}
OnItemClickListener 事件:
public AdapterView.OnItemClickListener d = new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> list, View view, int pos, long id) {
// TODO Auto-generated method stub
if(listener!=null){
listener.onPedidoSeleccionado((Lista_Item)list.getAdapter().getItem(pos));
}
String[] item = parts[pos].split("!");
Toast.makeText(getActivity(), "Ha pulsado el item " +item[0], Toast.LENGTH_SHORT).show();
Log.d("Color","Color = "+colorSaved);
if (currentSelectedView != null && currentSelectedView != view) {
unhighlightCurrentRow(currentSelectedView, colorSaved);
colorSaved = item[1];
}
currentSelectedView = view;
highlightCurrentRow(currentSelectedView);
colorSaved = item[1];
}
};
以及我上面使用的方法:
private void unhighlightCurrentRow(View rowView, String color) {
rowView.setBackgroundColor(Color.parseColor("#"+color));
}
private void highlightCurrentRow(View rowView) {
rowView.setBackgroundColor(Color.GREEN);
}
拜托,有什么帮助吗???
创建一个对象来设置一个arrayList,这个对象是这样的
`public class FormaPagoVO {
String id;
Boolean anadir;
create the variables do you want whit getter and setter.....
public Boolean getAnadir() {
return anadir;
}
public void setAnadir(Boolean anadir) {
this.anadir = anadir;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}`
然后在你的 activity 中像这样,并将数组传递给适配器
List<FormaPagoVO> arrayForma = new ArrayList<FormaPagoVO>();
FormaPagoAdapter adapterDos = new FormaPagoAdapter(getApplicationContext(),arrayForma);
listViewForma.setAdapter(adapterDos);
在适配器的getView中这个
if(getItem(position).getAnadir()){ // validate if check de listview or not and change de background
imgClientes.setBackgroundResource(R.drawable.seleccion1);
}else{
imgClientes.setBackgroundResource(R.drawable.seleccion);
}
点击列表视图
imgClientes.setOnClickListener( new android.view.View.OnClickListener() {
public void onClick(View v)
{
if(getItem(position).getAnadir()){
// vuelve a blanco
getItem(position).setAnadir(false);
}else{
// coloca verde
getItem(position).setAnadir(true);
}
}
});
就是这些
我的列表视图有问题;我在两个片段中创建了两个 ListView 以在相同的布局中显示它们
并且当我select左侧ListView中的一个项目时,会根据selected的项目自动刷新右侧ListView。 问题是,当我 select 右侧 ListView 中的一个项目时,它会将颜色更改为绿色,这没关系,因为我以这种方式编程,如果我 select 另一个项目,它必须更改为也是绿色,并保留第一个 selected 项目的原始颜色,如下图
所示但是当我将左侧的 ListView 滚动到 select 另一个项目时,我 return 到列表的顶部,项目 selected 的状态已经消失,因为我在下面显示
The new view, without keep the state selected
我知道原因是因为列表视图回收了它的项目视图,但我已经尝试了很多方法来尝试保持状态,无论我是否滚动列表,但我无法实现这个目标。 在这一点上,我不知道我必须从我的代码中更改什么;我给你看重要的部分;如果您需要更多信息或我的代码中的更多信息,请告诉我。
ListItem 的构造函数:
public class Lista_Item {
private String color, texto;
private String textoSuperior, textoInferior;
boolean seleccionado = false;
public Lista_Item(String color, String textoSuperior, String textoInferior, boolean seleccionado) {
// TODO Auto-generated constructor stub
this.color = color;
this.textoSuperior = textoSuperior;
this.textoInferior = textoInferior;
this.seleccionado = seleccionado;
}
public Lista_Item(String color, String texto) {
// TODO Auto-generated constructor stub
this.color = color;
this.texto = texto;
}
public String getTextoSuperior() {
return textoSuperior;
}
public String getTextoInferior() {
return textoInferior;
}
public boolean getSeleccionado() {
return seleccionado;
}
public String getTexto() {
return texto;
}
public String getColor() {
return color;
}
public void setSeleccionado(boolean seleccionado) {
this.seleccionado = seleccionado;
}
}
适配器:
private class ListAdapter extends ArrayAdapter<Lista_Item> {
private int mResourceId = 0;
private LayoutInflater mLayoutInflater;
public ListAdapter(Context context, int resource, int textViewResourceId, ArrayList<Lista_Item> listaItem) {
super(context, resource, textViewResourceId, listaItem);
mResourceId = resource;
mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = mLayoutInflater.inflate(mResourceId, parent, false);
holder = new ViewHolder();
holder.name = (TextView) convertView.findViewById(R.id.tvItemListaColor);
holder.l = (LinearLayout)convertView.findViewById(R.id.layoutColor);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
Lista_Item pedido = listItems.get(position);
holder.name.setText(pedido.getTexto());
holder.l.setBackgroundColor(Color.parseColor(pedido.getColor()));
holder.name.setTag(pedido);
return convertView;
}
private class ViewHolder {
TextView name;
LinearLayout l;
}
}
OnItemClickListener 事件:
public AdapterView.OnItemClickListener d = new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> list, View view, int pos, long id) {
// TODO Auto-generated method stub
if(listener!=null){
listener.onPedidoSeleccionado((Lista_Item)list.getAdapter().getItem(pos));
}
String[] item = parts[pos].split("!");
Toast.makeText(getActivity(), "Ha pulsado el item " +item[0], Toast.LENGTH_SHORT).show();
Log.d("Color","Color = "+colorSaved);
if (currentSelectedView != null && currentSelectedView != view) {
unhighlightCurrentRow(currentSelectedView, colorSaved);
colorSaved = item[1];
}
currentSelectedView = view;
highlightCurrentRow(currentSelectedView);
colorSaved = item[1];
}
};
以及我上面使用的方法:
private void unhighlightCurrentRow(View rowView, String color) {
rowView.setBackgroundColor(Color.parseColor("#"+color));
}
private void highlightCurrentRow(View rowView) {
rowView.setBackgroundColor(Color.GREEN);
}
拜托,有什么帮助吗???
创建一个对象来设置一个arrayList,这个对象是这样的
`public class FormaPagoVO {
String id;
Boolean anadir;
create the variables do you want whit getter and setter.....
public Boolean getAnadir() {
return anadir;
}
public void setAnadir(Boolean anadir) {
this.anadir = anadir;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}`
然后在你的 activity 中像这样,并将数组传递给适配器
List<FormaPagoVO> arrayForma = new ArrayList<FormaPagoVO>();
FormaPagoAdapter adapterDos = new FormaPagoAdapter(getApplicationContext(),arrayForma);
listViewForma.setAdapter(adapterDos);
在适配器的getView中这个
if(getItem(position).getAnadir()){ // validate if check de listview or not and change de background
imgClientes.setBackgroundResource(R.drawable.seleccion1);
}else{
imgClientes.setBackgroundResource(R.drawable.seleccion);
}
点击列表视图
imgClientes.setOnClickListener( new android.view.View.OnClickListener() {
public void onClick(View v)
{
if(getItem(position).getAnadir()){
// vuelve a blanco
getItem(position).setAnadir(false);
}else{
// coloca verde
getItem(position).setAnadir(true);
}
}
});
就是这些