Listview row selection

6 respostas
M

Ola vou tentar explicar da melhor maneira a minha duvida, é o seguinte.

Tenho uma listview, quando clico em algum item ele muda de cor, mas quando deixo de clicar, ele nao fica com a cor de seleccionado.
Tambem tenho dois botoes cima e baixo, tambem gostava que conforme vou para cima ou para baixo o item seleccionado fique noutra cor.

main.java

package com.applistview;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;

public class main extends Activity {
	
	private String[] listSongs = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K"};
	private ListView listView;
	private RowAdapter rowAdapter;
	private Button up;
	private Button down;
	private int pos;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        listView = (ListView) findViewById(R.id.list);
        
        listView.onTouchModeChanged(true);
        
        listView.setSelected(true);
        
        rowAdapter = new RowAdapter(this, listSongs);
        
        listView.setAdapter(rowAdapter);
        
        pos = 1;
        
        listView.setSelection(pos);
        
        up = (Button) findViewById(R.id.up);
        
        down = (Button) findViewById(R.id.down);
        
        up.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				if(pos >1)
					pos--;
				listView.setSelection(pos);
			}
		});
        
        down.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				int p = listView.getCount();
				if(pos<listView.getCount())
					pos++;
				listView.setSelection(pos);
			}
		});
        
    }
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
<ListView android:id="@+id/list" 
	android:layout_height="200dip" 
	android:layout_width="fill_parent"
	android:background="#FFF"
	android:cacheColorHint="#00000000">
	</ListView>
<Button android:text="Cima" 
		android:id="@+id/up" 
		android:layout_width="wrap_content" 
		android:layout_height="wrap_content"></Button>
<Button android:text="Baixo" 
		android:id="@+id/down" 
		android:layout_width="wrap_content" 
		android:layout_height="wrap_content"></Button>
</LinearLayout>

RowAdaptar.java

package com.applistview;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class RowAdapter extends BaseAdapter {
	
	Context mContext;
	private Activity activity;
	private String[] rows;
	private static LayoutInflater mInflater = null;
	
	public RowAdapter(Context context, String[] rows) {
		
		//this.activity = activity;
		this.rows = rows;
		
		mInflater = LayoutInflater.from(context);
		//this.context = context;
	}

	@Override
	public int getCount() {
		return rows.length;
	}

	@Override
	public Object getItem(int position) {
		return position;
	}

	@Override
	public long getItemId(int position) {
		return position;
	}
	
	public static class ViewHolder {
		public TextView bulletrow;
		public TextView textrow;
	}
	
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		ViewHolder viewHolder = null;
		
		if(convertView == null) {
			convertView = mInflater.inflate(R.layout.rowitem, null);
			
			viewHolder = new ViewHolder();
			viewHolder.bulletrow = (TextView) convertView.findViewById(R.id.bulletrow);
			viewHolder.textrow = (TextView) convertView.findViewById(R.id.textrow);
			convertView.setTag(viewHolder);
		} else {
			viewHolder = (ViewHolder) convertView.getTag();
		}
		
		viewHolder.textrow.setText(rows[position]);
		
		return convertView;
	}

}

rowitem.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/rowitem"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:orientation="horizontal"
  android:background="@color/list_bg"
  >
    <TextView
    	android:id="@+id/bulletrow"
    	android:layout_width="40dip"
    	android:layout_height="fill_parent"
    	android:gravity="center_horizontal|center_vertical"
    	android:text=":"
    	android:textSize="20dip" 
    	android:textStyle="bold">
    </TextView>
    <TextView 
    	android:id="@+id/textrow"
    	android:layout_width="fill_parent" 
    	android:layout_height="fill_parent"
    	android:gravity="center_vertical"
    	android:text="">
    </TextView>
</LinearLayout>

list_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item 
	android:state_selected="false"
    android:state_pressed="false" 
    android:drawable="@color/grey" />
<item android:state_pressed="true" 
    android:drawable="@color/blue" />
<item android:state_selected="true"
	android:state_pressed="false" 
    android:drawable="@color/blue" />
</selector>

colors.xml

<?xml version="1.0" encoding="UTF-8"?>
<resources>
	<color name="blue">#0303ff</color>
	<color name="grey">#f7f7f7</color>
</resources>

Eu gostava de saber se tenho de fazer isso programaticamente, ou posso fazer com xml e como?

Desculpem se estou a ser chato.

Cumps[[]]

6 Respostas

Marky.Vasconcelos

Voce tem que fazer isso pelo background da sua ViewHolder.

M

Obrigado, vou tentar isso.

Estava com a esperanca que houvesse algo nativo para não carregar tanto a aplicação.

Cumprimentos.

M

Não estou a conseguir, podes dar um exemplo por favor.

Cumprimentos

M

Na minah classe main tenho o seguitne codigo

up.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				
				int pos = listView.getPositionForView(lastView);
				
				int first = listView.getFirstVisiblePosition();
				
				if(pos != 0) {
					lastView.setSelected(false);
					
					if(pos - first -1 < 0) {
						listView.setSelection(pos - 1);
						//listView.getSelectedView().setSelected(true);
						//lastView = (View) listView.getChildAt(pos - first - 1);
					} else {
						lastView = (View) listView.getChildAt(pos - first - 1);
						lastView.setSelected(true);
					}
					
					//lastView.setSelected(true);
					
				}
			}
		});

Tenho sete linhas viviveis na minha listview, o conteudo das linhas (“A”, “B”, “C”, “D”, “E”, “F”, “G”, “H”, “I”, “J”, “K”).
Enquanto navego nessas linhas para cima e para baixo, ele entra no if como false (false) e executa este codigo

lastView = (View) listView.getChildAt(pos - first - 1);
lastView.setSelected(true);

até aqui tudo bem, mas quando estou por exemplo em B e quero ir para o A (para cima), que neste caso o A não esta visivel, tenho de fazer um

listView.setSelection(pos - 1);

para mover o scroll, só que ele so move o scroll quando terminar de executar nosso método assim que nao posso fazer

Alguem me pode ajudar, ou algum método melhor para fazer isto?

Cumprimentos.

M

Peço sugestões por favor…

M

Esta solucionado.

Obrigado.

Criado 12 de maio de 2011
Ultima resposta 15 de jun. de 2011
Respostas 6
Participantes 2