2015-12-31 135 views
0

我試圖創建我的第一個Android應用程序,但我不能做我想做的事。 我的想法是創建一個簡單的分數計數器。我有一個listview的活動。列表視圖的每個項目都有一個帶名稱的TextView,兩個用於添加和減去的按鈕以及一個用於分數的TextView。Android自定義列表視圖適配器和numberpicker dialogfragment

我的想法是當用戶點擊分數時選擇一個數字來增加減少,以顯示一個custum numberpicker。自定義的numberpicker有一個接口來使用回調方法來獲得選擇的號碼。

在activity類中,我有一個用於listview的自定義適配器,以及一個用於改進功能的viewholder類。我有幾個疑問/問題:

1)我什麼時候可以定義按鈕/文本瀏覽器的監聽器?目前,我在視圖中有偵聽器,但我不確定它是否是更好的解決方案,也許最好在適配器中定義它們,或者爲listview創建一個onitemclicklistener。

2)我可以實現在適配器或視圖持有者類中的numberpicker對話框接口中定義的方法嗎?我已經嘗試過,但我得到一個演員例外,因爲內部類不是活動...

3)如果我在活動(外部)類中實現接口方法,我無法修改調用數字選擇器的所需文本視圖...

我的兩個主要問題是在哪裏以及如何爲listview行中的每個視圖定義偵聽器,以及如何獲取numberpicker對話框的數量並繼續執行......

任何人都可以幫助我嗎?

謝謝。

+1

1)您在適配器中定義onClick偵聽器。 2)發佈您的代碼。 3)發佈您的代碼。 –

回答

0

要在適配器內的視圖中使用偵聽器,應該在適配器中聲明偵聽器,並且應該爲每個視圖創建一個新的偵聽器實例。

private static class ViewHolder { 
    private CustomListener listener; 
    private Button incrementBtn; 
} 

現在在getView()方法:

holder.listener = new CustomListener(position); 
holder.incrementBtn.setOnClickListener(holder.listener); 

現在定義繼承的類來實現onClick()方法:

private class CustomListener implements View.OnClickListener { 
    private int position; 

    protected CustomListener(int position) { 
     this.position = position; 
    } 

    @Override 
    public void onClick(View v) { 
     //increment score here 
     notifyDataSetChanged(); 
    } 
} 

一旦onClick()方法經由notifyDataSetChanged()完成後,用更新的視圖與新的比分。 要使用數字選取器對話框,它與在視圖中定義的DialogInterface.OnClickListener的模式相同。

0

當然,對不起......

package com.example.cdp.mispartidas; 

imports... 

public class Tanteo extends ActionBarActivity { 

private String identificador; 
private Partida partida; 
private Backup backup; 
private int indice; 
private static Context context; 

ListView listviewjugadores; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_tanteo); 

    // Parametros 
    listviewjugadores = (ListView) findViewById(R.id.jugadorestanteo); 

    Tanteo.context = getApplicationContext(); 

    Log.i("MILOG", "Obtenemos el backup"); 
    backup = Backup.getMiBackup(getApplicationContext()); 

    // Obtenemos el numero de jugadores 
    Bundle bundle = getIntent().getExtras(); 
    identificador = bundle.getString("idpartida"); 

    Log.i("MILOG", "El identificador de la partida es " + identificador); 


    // Buscamos la partida 
    indice = backup.getPartida(identificador); 
    if (indice >= 0) { 
     partida = backup.getBackup().get(indice); 
     // Establecemos el adaptador 
     Log.i("MILOG", "Establecemos el adaptador"); 
     AdaptadorTanteo adaptador = new AdaptadorTanteo(this, getTaskId(), partida.getJugadores()); 
     listviewjugadores.setAdapter(adaptador); 
    } else { 
     Toast.makeText(this, "No se ha encontrado la partida " + identificador, Toast.LENGTH_SHORT).show(); 
    } 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_tanteo, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    int numjugadores; 

    switch(id){ 
     // Anadimos un nuevo jugador a la partida 
     case R.id.addjugador: 
      numjugadores = listviewjugadores.getAdapter().getCount(); 
      Jugador player = new Jugador(); 
      // Ponemos un nombre por defecto 
      player.setNombre("Jugador" + String.valueOf(numjugadores + 1)); 
      player.setNumerojugador(numjugadores + 1); 
      // Anadimos la puntuacion 
      player.setPuntuacion(0); 
      // Anadimos el jugador a la lista 
      partida.addJugador(player); 
      // Actualizamos el backup 
      backup.getBackup().set(indice, partida); 
      // Almacenamos 
      Log.i("MILOG", "Guardamos el backup"); 
      backup.guardarBackup(); 
      // Si todo ha ido bien, acutalizamos la lista de jugadores 
      ((AdaptadorTanteo) listviewjugadores.getAdapter()).notifyDataSetChanged(); 
      break; 

     case R.id.partidasguardadas: 
      // Llamamos al intent de nuestras partidas guardadas 
      Intent intenthistorial = new Intent(this, Historial.class); 
      startActivity(intenthistorial); 
      break; 

     case R.id.reiniciarpartida: 
      // Ponemos todos los marcadores a 0 
      // Recorremos nuestra partida 
      numjugadores = partida.getJugadores().size(); 
      // recorremos y reiniciamos 
      for(int i = 0; i < numjugadores; i++){ 
       partida.getJugadores().get(i).setPuntuacion(0); 
      } 
      // Actualizamos el backup 
      backup.getBackup().set(indice, partida); 
      // Almacenamos 
      Log.i("MILOG", "Guardamos el backup"); 
      backup.guardarBackup(); 
      // Si todo ha ido bien, acutalizamos la lista de jugadores 
      ((AdaptadorTanteo) listviewjugadores.getAdapter()).notifyDataSetChanged(); 
      break; 

     case R.id.action_settings: 
      break; 
     default: 
      return true; 
    } 


    return super.onOptionsItemSelected(item); 
} 

// Adaptador para el layout del listview 
public class AdaptadorTanteo extends ArrayAdapter<Jugador> { 

    Activity context; 
    List<Jugador> jugadores; 
    ViewHolder holder; 

    AdaptadorTanteo(Activity context, int textViewResourceId, List<Jugador> listajugadores) { 
     super(context, textViewResourceId, listajugadores); 
     this.context = context; 
     this.jugadores = listajugadores; 
    } 

    public View getView(final int position, View convertView, ViewGroup parent) { 
     View item = convertView; 

     // Optimizamos el rendimiento de nuestra lista 
     // Si la vista no existe, la creamos 
     if (item == null) { 
      LayoutInflater inflater = context.getLayoutInflater(); 
      item = inflater.inflate(R.layout.tanteo_jugador, null); 

      // Declaramos el holder pasandole nuestras vistas 
      TextView nombre = (TextView) item.findViewById(R.id.nombrejugador); 
      TextView puntuacion = (TextView) item.findViewById(R.id.puntos); 
      ImageButton mas = (ImageButton) item.findViewById(R.id.sumar); 
      ImageButton menos = (ImageButton) item.findViewById(R.id.restar); 

      holder = new ViewHolder(nombre, puntuacion, mas, menos); 

      // Establecemos el tag 
      item.setTag(holder); 
     } 
     // Si la vista existe, la reusamos 
     else { 
      holder = (ViewHolder) item.getTag(); 
     } 

     // Guardamos la posicion en el holder para usarlo en los listener 
     holder.botonmas.setTag(position); 
     holder.botonmenos.setTag(position); 
     holder.puntos.setTag(position); 

     // Establecemos el nombre por defecto 
     holder.nombrejugador.setText(jugadores.get(position).getNombre()); 
     holder.puntos.setText(String.valueOf(jugadores.get(position).getPuntuacion())); 

     return (item); 
    } 
} 


class ViewHolder implements NumeroTanteoDialogFragment.NumberTanteoDialogListener{ 

    TextView nombrejugador; 
    TextView puntos; 
    ImageButton botonmas; 
    ImageButton botonmenos; 
    int position; 

    public ViewHolder(TextView nombre, TextView puntuacion, ImageButton mas, ImageButton menos) { 

     nombrejugador = nombre; 
     puntos = puntuacion; 
     botonmas = mas; 
     botonmenos = menos; 

     // Definimos los listener 
     nombrejugador.setOnClickListener(miListenerLocal); 
     puntos.setOnClickListener(miListenerLocal); 
     botonmas.setOnClickListener(miListenerLocal); 
     botonmenos.setOnClickListener(miListenerLocal); 

    } 

    // Creamos aqui los listener 
    // Asi tenemos acceso al resto de vistas dentro de la fila 
    private View.OnClickListener miListenerLocal = new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      position = (Integer) v.getTag(); 

      // Comprobamos la vista que lo esta invocando 
      switch (v.getId()) { 
       case R.id.nombrejugador: 

        break; 

       case R.id.puntos: 
        try { 
         // Decrementamos el tanteo 
         Log.i("MILOG", "Modificamos el tanteo"); 
         // Lanzamos el dialog 
         NumeroTanteoDialogFragment fragmento = new NumeroTanteoDialogFragment(); 
         Bundle bundles = new Bundle(); 
         bundles.putString("titulo", getString(R.string.sumar_puntos)); 
         fragmento.setArguments(bundles); 
         Log.i("MILOG", "Mostramos el dialog para elegir el numero que queremos modificar"); 
         FragmentManager fragmentManager = ((Activity) context).getFragmentManager(); 
         fragmento.show(fragmentManager, "Dialogo_jugadores"); 

        } catch (Exception ex) { 
         Toast.makeText(Tanteo.context, "Se produjo un error al modificar el tanteo", Toast.LENGTH_SHORT).show(); 
        } 
        break; 

       case R.id.sumar: 
        try { 
         Log.i("MILOG", "Sumamos uno"); 
         // Incrementamos el tanteo 
         int tantos = Integer.parseInt(puntos.getText().toString()) + 1; 
         puntos.setText(String.valueOf(tantos)); 
         // Actualizamos el backup 
         partida.getJugadores().get(position).setPuntuacion(tantos); 
         // Actualizamos el backup 
         backup.getBackup().set(indice, partida); 
         // Almacenamos 
         Log.i("MILOG", "Guardamos el backup"); 
         backup.guardarBackup(); 

        } catch (Exception ex) { 
         Toast.makeText(Tanteo.context, "Se produjo un error al incrementar el tanteo", Toast.LENGTH_SHORT).show(); 
        } 
        break; 

       case R.id.restar: 
        try { 
         // Decrementamos el tanteo 
         Log.i("MILOG", "Restamos uno"); 
         int tantos = Integer.parseInt(puntos.getText().toString()) - 1; 
         puntos.setText(String.valueOf(puntos)); 
         // Actualizamos el backup 
         partida.getJugadores().get(position).setPuntuacion(tantos); 
         // Actualizamos el backup 
         backup.getBackup().set(indice, partida); 
         // Almacenamos 
         Log.i("MILOG", "Guardamos el backup"); 
         backup.guardarBackup(); 
        } catch (Exception ex) { 
         Toast.makeText(Tanteo.context, "Se produjo un error al decrementar el tanteo", Toast.LENGTH_SHORT).show(); 
        } 
        break; 

      } 
     } 
    }; 

    // Sobreescribimos el metodo del dialogo para elegir el numero 
    @Override 
    public void onNumberSelected(int number) { 

     Log.i("MILOG", "Actualizamos los puntos con el dialog"); 
     int puntuacion = Integer.parseInt(puntos.getText().toString()) + number; 
     // Modificamos los puntos 
     puntos.setText(String.valueOf(puntuacion)); 

     // Actualizamos el backup 
     partida.getJugadores().get(position).setPuntuacion(puntuacion); 
     // Actualizamos el backup 
     backup.getBackup().set(indice, partida); 
     // Almacenamos 
     Log.i("MILOG", "Guardamos el backup"); 
     backup.guardarBackup(); 
    } 
} 

}

0

感謝您的幫助,

從來就解決了它使用的適應症。正如你告訴我的,我定義了聽衆。我的一個問題是我在兩個不同的地方更新了viewholder對象。我改變了它,並且還用notifyDataSetChanged()更新了視圖。

numberpicker的解決方案是在主要活動中實現回調方法,並將listview的位置作爲參數傳遞以更改正確的項目。

此致敬禮。

相關問題