with studio programacion móviles dinamico desarrollo curso con botones aplicaciones android listview simplecursoradapter

studio - listview with button android



¿Cómo obtener una posición de elemento de lista haciendo clic en el botón dentro de ella? (8)

Creo que hay un mejor enfoque. Puede agregar una etiqueta como posición con el botón usando el método (button.setTag ()) y cada vez que el usuario haga clic en el botón, tome la etiqueta de este botón. Será más fácil.

Gracias y Saludos Rahul

En realidad, he leído algunas preguntas anteriores sobre esto ...

Este es el código que uso

auto = (ListView)findViewById(R.id.auto); String[] projection = new String[] {Browser.BookmarkColumns._ID,Browser.BookmarkColumns.TITLE,Browser.BookmarkColumns.URL}; String[] displayFields = new String[] {Browser.BookmarkColumns.TITLE, Browser.BookmarkColumns.URL}; int[] displayViews = new int[] { R.id.text1,R.id.text2 }; Cursor cur = managedQuery(android.provider.Browser.BOOKMARKS_URI,projection, null, null, null); //auto.setAdapter(new SimpleCursorAdapter(this, R.layout.mylist, cur,displayFields, displayViews)); myAdapter apt = new myAdapter(this, R.layout.mylist, cur,displayFields, displayViews); auto.setAdapter(apt);

y clase myAdapter

class myAdapter extends SimpleCursorAdapter{ private Cursor c; private Context context; public myAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { super(context, layout, c, from, to); // TODO Auto-generated constructor stub this.c = c; this.context = context; AutoList att = new AutoList(); mListView = att.auto; } @Override public View getView(int pos, View inView, ViewGroup parent) { View vix = inView; if (vix == null) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); vix = inflater.inflate(R.layout.mylist, null); } this.c.moveToPosition(pos); String title = this.c.getString(this.c.getColumnIndex(Browser.BookmarkColumns.TITLE)); String cont = this.c.getString(this.c.getColumnIndex(Browser.BookmarkColumns.URL)); TextView text1 = (TextView) vix.findViewById(R.id.text1); text1.setText(title); TextView text2 = (TextView) vix.findViewById(R.id.text2); text2.setText(cont); Button butt = (Button) vix.findViewById(R.id.button); butt.setOnClickListener(mButt); return vix; } private OnClickListener mButt = new OnClickListener() { @Override public void onClick(View v) { final int position = mListView.getPositionForView((View) v.getParent()); Log.v("BUTT", "Title clicked, row "+position); } };

Sin embargo, cuando hago clic en el botón, todavía recibo muchos errores como este:

04-10 22:30:55.152: ERROR/AndroidRuntime(695): FATAL EXCEPTION: main 04-10 22:30:55.152: ERROR/AndroidRuntime(695): java.lang.NullPointerException 04-10 22:30:55.152: ERROR/AndroidRuntime(695): at com.auto2.AutoList$myAdapter$1.onClick(AutoList.java:113) 04-10 22:30:55.152: ERROR/AndroidRuntime(695): at android.view.View.performClick(View.java:2408) 04-10 22:30:55.152: ERROR/AndroidRuntime(695): at android.view.View$PerformClick.run(View.java:8816) 04-10 22:30:55.152: ERROR/AndroidRuntime(695): at android.os.Handler.handleCallback(Handler.java:587) 04-10 22:30:55.152: ERROR/AndroidRuntime(695): at android.os.Handler.dispatchMessage(Handler.java:92) 04-10 22:30:55.152: ERROR/AndroidRuntime(695): at android.os.Looper.loop(Looper.java:123) 04-10 22:30:55.152: ERROR/AndroidRuntime(695): at android.app.ActivityThread.main(ActivityThread.java:4627) 04-10 22:30:55.152: ERROR/AndroidRuntime(695): at java.lang.reflect.Method.invokeNative(Native Method) 04-10 22:30:55.152: ERROR/AndroidRuntime(695): at java.lang.reflect.Method.invoke(Method.java:521) 04-10 22:30:55.152: ERROR/AndroidRuntime(695): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 04-10 22:30:55.152: ERROR/AndroidRuntime(695): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 04-10 22:30:55.152: ERROR/AndroidRuntime(695): at dalvik.system.NativeStart.main(Native Method)

¡Eso es! ¡Espero que no sea tan difícil ser descubierto!

¡Gracias!


En realidad, utilicé el mismo enfoque: simplemente agregué el diseño principal y obtuve la posición sin excepción

public void deleteButtonClick(View v) { //TODO Remove favorite - DB + file system Toast.makeText(this, "Deleting bookmark", Toast.LENGTH_SHORT).show(); final int position = getListView().getPositionForView((LinearLayout)v.getParent()); if (position >= 0) { Favorite o = (Favorite) this.getListAdapter().getItem(position); } }

Mi diseño para la fila listview:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res/com.bbox.application" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <com.markupartist.android.widget.ActionBar android:id="@+id/actionbar" app:title="@string/ac_title" style="@style/ActionBar" /> <ListView android:id="@+id/android:list" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="5" android:background="@drawable/categrory_bckgr" /> <TextView android:id="@+id/android:empty" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/main_no_items" /> </LinearLayout>

Espero que te ayude.


Muy simple. En su clase de Adaptador, el método getView cambia la posición int a la posición int final .

public View getView(final int position, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View row = inflater.inflate(yourcustomizeditemview.xml, parent, false); Button btn= (Button) row.findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Toast.makeText(context, " "+position, Toast.LENGTH_SHORT).show(); } }); return row; }

ahora en el Button clic Toast muestra la posición del elemento en el que está presente el Button .


Parece que en onClick() que mListView es nulo. Es posible que

auto = (ListView)findViewById(R.id.auto);

devuelto nulo, porque no se pudo encontrar una vista de R.id.auto en el diseño actual. Puse un punto de ruptura del depurador justo después de esa línea y lo vería.


Podemos obtener la posición implementando onClickListener dentro del método getView del adaptador.

ADAPTADOR:

public class DetailsListAdapter extends BaseAdapter { Context context; ArrayList<Profile> data; public DetailsListAdapter(Context context, ArrayList<Profile> data) { this.context = context; this.data = data; } @Override public int getCount() { return data.size(); } @Override public Object getItem(int position) { return data.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.list_item_logs_details, null); viewHolder = new ViewHolder(); viewHolder.btn = (Button) convertView.findViewById(R.id.log_details_1_a); viewHolder.btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d("statusPosition","position "+position); } }); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } return convertView; } public static class ViewHolder { TextView tv2, tv3, tv3a, tv4, tv4a; Button btn; } }


Probablemente, una solución más fácil para esto es cuando su Actividad implementa OnClickListener y usted establece el Contexto (fundido) como OnClickListener en cualquier vista que desee en el Adaptador. Para código más robusto puede consultar con instanceof.

public class MyActivity implements OnClickListener { // ... } public class MyAdapter extends CursorAdapter { @Override public void bindView(View view, Context context, Cursor cursor) { final TextView tv = (View) view.findViewById(R.id.text1); setOnClickListener((OnClickListener)context); tv.setTag(cursor.getPosition()); } }

Para mayor comodidad, puede establecer la posición de los elementos en el adaptador como Etiqueta de la vista. De esta forma, puede buscar fácilmente todo el elemento en el adaptador.


ejecutas esto

btnNxt = (Button) findViewById(R.id.btnNext); btnNxt.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //Here I need to get that position });

¿Dentro del método getView? si es asi es muy facil

btnNxt = (Button) findViewById(R.id.btnNext); btnNxt.setTag(position); btnNxt.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { int position=(Integer)arg0.getTag(); });

de esto: https://.com/a/20542034


ListView con botones pulsables!

Bueno ..., aquí está el método aproximado para resolver mi problema TANTO ...

item.xml:

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:orientation="horizontal" android:layout_height="wrap_content"> <TextView android:id="@+id/showTv" android:layout_alignParentLeft="true" android:gravity="center_vertical" android:textSize="24dip" android:layout_height="wrap_content" android:layout_width="wrap_content" /> <RelativeLayout android:id="@+id/jjjj" android:layout_alignParentRight="true" android:layout_height="wrap_content" android:layout_width="wrap_content"> <Button android:id="@+id/gointoBt" android:focusable="false" android:layout_alignParentRight="true" android:text="abc" android:layout_height="wrap_content" android:layout_width="wrap_content"/> <Button android:id="@+id/chooseBt" android:layout_toLeftOf="@id/gointoBt" android:layout_marginRight="10dip" android:text="text" android:focusable="false" android:layout_height="wrap_content" android:layout_width="wrap_content"/> </RelativeLayout>

MySimpleAdapter :

import ........; public class MySimpleAdapter extends SimpleAdapter { private final Context context; private List<Map<String, Object>> data; private int resource; private String[] from; private int[] to; public MySimpleAdapter(Context context,List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) { super(context, data, resource, from, to); this.context=context; this.data=(List<Map<String, Object>>) data; this.resource=resource; this.from=from; this.to=to; } @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = ((Activity)context).getLayoutInflater(); View rowView = inflater.inflate(resource, null, true); Map<String, Object> medMap=data.get(position); final TextView[] showTv=new TextView[from.length]; for (int i = 0; i < from.length; i++) { showTv[i]=(TextView)rowView.findViewById(to[i]); showTv[i].setText(""+medMap.get(from[i])); } Button btn=(Button)rowView.findViewById(R.id.gointoBt); Button.OnClickListener mOkOnClickListener = new Button.OnClickListener() { public void onClick(View v) { Log.v("ttttttt", ""+showTv[0].getText()); Toast.makeText(context,""+showTv[0].getText(), Toast.LENGTH_LONG).show(); } }; btn.setOnClickListener(mOkOnClickListener); Button btn2=(Button)rowView.findViewById(R.id.chooseBt); Button.OnClickListener mOkOnClickListener2 = new Button.OnClickListener() { public void onClick(View v) { Log.v("hhhhhhh", ""+showTv[0].getText()); Toast.makeText(context,"abc"+showTv[0].getText(), Toast.LENGTH_LONG).show(); } }; btn2.setOnClickListener(mOkOnClickListener2); return rowView; } }

Actividad:

import .......; public class ActivityMain extends Activity { ListView listview; List<Map<String,Object>> data; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTitle("My work"); prepareData(); listview =new ListView(this); MySimpleAdapter adapter=new MySimpleAdapter(this,data,R.layout.item,new String[] {"uu"},new int[]{R.id.showTv}); listview.setAdapter(adapter); setContentView(listview); } private void prepareData(){ data=new ArrayList<Map<String,Object>>(); Map<String,Object> item; item=new HashMap<String,Object>(); item.put("uu", "hello"); data.add(item); item=new HashMap<String,Object>(); item.put("uu", "myyou"); data.add(item); item=new HashMap<String,Object>(); item.put("uu", "piero"); data.add(item); } }

Gracias por ese Hombre que es tan amable de proporcionar este tutorial IMPRESIONANTE Y MÁS GRANDE ... que nadie aquí podría dar a los noobs ...