2015-11-04 56 views
0

我有一個列表視圖的問題;我在兩個片段中創建了兩個ListView以在同一個佈局中顯示它們當我滾動列表時,如何從列表視圖中保持狀態(如所選項目)?

而且,當我從左側ListView中選擇一個項目時,根據所選項目自動刷新右側ListView。 問題是,當我從右側的ListView中選擇一個項目時,它將顏色更改爲綠色,這沒問題,因爲我是以這種方式編程的,如果我選擇另一個項目,它也必須更改爲綠色,並保留原始從第一個選擇項的顏色,就像我告訴你下面的圖片

First selection

但是當我滾動左側ListView中選擇另一個項目,我返回到列表的頂部,的狀態選擇的項目已經走了,正如我在下面

The new view, without keep the state selected

我知道原因是因爲列表視圖回收它的項目視圖,但我嘗試了很多事情來試圖保持狀態,無論我滾動列表,但我無法實現此目標。 在這一點上,我不知道我必須從我的代碼中改變什麼;我向你展示重要的部分;如果你需要更多的信息,請告訴我。

的列表項的構造:

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

    } 

請,任何幫助???

+2

什麼peating? – mubeen

+0

更改您的問題的標題,以便更有意義。 – Henry

+0

嗨,我很抱歉,但由於某種原因,這不會讓我寫自己的標題,而是從另外的問題或主題寫下另一個問題或主題,但問題是:**我該如何保持狀態在ListView的項目中(如選中的項目)當我滾動列表** –

回答

0

創建一個對象設置一個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; 
    } 
}` 

然後在你的活動這樣的事情,並通過陣列適配器

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

int點擊列表視圖

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

就是所有

+0

嗨,請問,在某些事情中,您可能更具針對性,例如,我必須推遲與ViewHolder相關的代碼,並放置你的?哪裏是準確放置代碼的正確位置;我的意思是,從外部** if(convertView == null)**或在其他語句中...可以解釋這部分嗎?我已經試圖根據我的需要放置你的代碼,但它不能正常工作,所以我認爲我做錯了什麼... –

+0

嗨沒有替換我的代碼,只看到即時通訊使用de objectVO設置de狀態的項目在位置clicekd在列表視圖,當用戶點擊項目我設置object.anadir = true,當de列表視圖傳遞該位置答案是真或假爲了使東西 –

相關問題