2015-01-11 5 views
0

ArrayAdapter를 확장하는 어댑터가 있습니다. 예를 들어 9 개의 객체로 AdapterList에 ArrayList를 제공하고 ListView에 다섯 번째 객체를 표시하지 않도록하고 싶습니다.convertView를 반환하지 않는 어댑터를 만드는 방법은 무엇입니까?

이 방법이 있습니까? 나는 반환하기 전에 convertView = null 설정을 시도했지만 NullPointerException을 던졌습니다.

이 관련 코드는,이 값을하지 않도록보기를하게되지만, 어쨌든 목록보기에 추가 :

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Map; 

import android.annotation.SuppressLint; 
import android.app.Activity; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.Switch; 
import android.widget.TextView; 
import android.widget.Toast; 


/*@SuppressLint("ViewHolder") */public class AdapterActions extends ArrayAdapter<Action>{ 

    // our ViewHolder. 
    // caches our TextView 
    static class ViewHolderItem { 
     TextView codigo; 
     TextView accion; 
     TextView evento; 
     Switch UnSwitch; 
     boolean isChecked1; 
    } 

    Activity context; 
    ArrayList<Action> listaActions; 
    @SuppressLint("UseSparseArrays") Map <Integer, Boolean> map = new HashMap<Integer, Boolean>(); 

    // Le pasamos al constructor el contexto y la lista de contactos 
    public AdapterActions(Activity context, ArrayList<Action> listaActions) { 
     super(context, R.layout.layout_adapter_actions, listaActions); 
     this.context = context; 
     this.listaActions = listaActions; 




    } 

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

     ViewHolderItem viewHolder; 

     // Rescatamos cada item del listview y lo inflamos con nuestro layout 
     //View item = convertView; 
     //item = context.getLayoutInflater().inflate(R.layout.layout_adapter_actions, null); 
     // well set up the ViewHolder 
     viewHolder = new ViewHolderItem(); 

     if(convertView==null){ 

      // inflate the layout 
      LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
      convertView = inflater.inflate(R.layout.layout_adapter_actions, parent, false); 

      // well set up the ViewHolder 
      viewHolder.codigo = (TextView) convertView.findViewById(R.id.codigo); 
      viewHolder.accion = (TextView) convertView.findViewById(R.id.accion); 
      viewHolder.evento = (TextView) convertView.findViewById(R.id.evento); 
      viewHolder.UnSwitch = (Switch) convertView.findViewById(R.id.activa); 
      convertView.setLongClickable(true); 

      // store the holder with the view. 
      convertView.setTag(viewHolder); 

     }else{ 
      // we've just avoided calling findViewById() on resource everytime 
      // just use the viewHolder 
      viewHolder = (ViewHolderItem) convertView.getTag(); 
     } 

     Action a = new Action(-99, 1, 1, true); 
     AccionDefinida LaAccion = new AccionDefinida(0, 0, "", ""); 
     EventoDefinido ElEvento = new EventoDefinido(0, 0, "", ""); 

     //ACTIONS 
       ActionsSQLite base = new ActionsSQLite(context, "Actions", null,1); 
       SQLiteDatabase db1 = base.getReadableDatabase(); 
       db1 = context.openOrCreateDatabase("Actions",SQLiteDatabase.OPEN_READONLY, null); 

       String query = "SELECT * FROM Actions WHERE Id = " + String.valueOf(position + 1); 
       Cursor c1 = db1.rawQuery(query, null); 

       try{ 
        if(c1!=null){ 

         int i = c1.getColumnIndexOrThrow("Id"); 
         int j = c1.getColumnIndexOrThrow("IdAccionDefinida"); 
         int k = c1.getColumnIndexOrThrow("IdEventoDefinido"); 
         int l = c1.getColumnIndexOrThrow("Activa"); 
         boolean esActiva; 

         //Nos aseguramos de que existe al menos un registro 
         while(c1.moveToNext()){ 
          if (c1.getInt(l) == 0){ 
           esActiva = false; 
          } else 
          { 
           esActiva = true; 
          } 
          //Recorremos el cursor hasta que no haya más registros 
          a = new Action(c1.getInt(i), c1.getInt(j), c1.getInt(k), esActiva); 
         } 
        } 
        else 
         Toast.makeText(context.getApplicationContext(), 
            "No hay nada :(", Toast.LENGTH_LONG).show(); 
        } 
        catch (Exception e){ 
        Log.i("bdActions", "Error al abrir o crear la base de datos" + e); 
        } 

        if(db1!=null){ 
         db1.close(); 
       } 

     if(a.getId() != -99) 
     { 
     //EVENTOS 
     EventosDefinidosSQLite base2 = new EventosDefinidosSQLite(this.context, "EventosDefinidos", null, 1); 
     SQLiteDatabase db2 = base2.getReadableDatabase(); 
     db2 = context.openOrCreateDatabase("EventosDefinidos",SQLiteDatabase.OPEN_READONLY, null); 

     String query2 = "SELECT * FROM EventosDefinidos WHERE Id = " + a.getIdEventoDefinido(); 
     Cursor c2 = db2.rawQuery(query2, null); 
     try{ 
      if(c2!=null){ 

       int h = c2.getColumnIndexOrThrow("Id"); 
       int k = c2.getColumnIndexOrThrow("IdEvento"); 
       int i = c2.getColumnIndexOrThrow("Nombre"); 
       int j = c2.getColumnIndexOrThrow("Aux"); 

       //Nos aseguramos de que existe al menos un registro 
       while(c2.moveToNext()){ 
        //Recorremos el cursor hasta que no haya más registros 
        ElEvento = new EventoDefinido(c2.getInt(h), c2.getInt(k), c2.getString(i), c2.getString(j)); 
       } 
      } 
      else 
       Toast.makeText(context.getApplicationContext(), 
         "No hay nada :(", Toast.LENGTH_LONG).show(); 
     } 
     catch (Exception e){ 
      Log.i("bdEventos", "Error al abrir o crear la base de datos" + e); 
     } 

     if(db2!=null){ 
      db2.close(); 
     } 
     //ACCIONES 
     AccionesDefinidasSQLite base3 = new AccionesDefinidasSQLite(context, "AccionesDefinidas", null,1); 
     SQLiteDatabase db3 = base3.getReadableDatabase(); 
     db3 = context.openOrCreateDatabase("AccionesDefinidas", SQLiteDatabase.OPEN_READONLY, null); 

     String query3 = "SELECT * FROM AccionesDefinidas WHERE Id = " + String.valueOf(a.getIdAccionDefinida()); 
     Cursor c3 = db3.rawQuery(query3, null); 
     try{ 
      if(c3!=null){ 

       int h = c3.getColumnIndexOrThrow("Id"); 
       int k = c3.getColumnIndexOrThrow("IdAccion"); 
       int i = c3.getColumnIndexOrThrow("Nombre"); 
       int j = c3.getColumnIndexOrThrow("Aux"); 

       //Nos aseguramos de que existe al menos un registro 
       while(c3.moveToNext()){ 
        //Recorremos el cursor hasta que no haya más registros 
        LaAccion = new AccionDefinida(c3.getInt(h), c3.getInt(k), c3.getString(i), c3.getString(j)); 
       } 
      } 
      else 
       Toast.makeText(context.getApplicationContext(), 
         "No hay nada :(", Toast.LENGTH_LONG).show(); 
     } 
     catch (Exception e){ 
      Log.i("bdAcciones", "Error al abrir o crear la base de datos" + e); 
     } 

     if(db3!=null){ 
      db3.close(); 
     } 

     // object item based on the position 


     // assign values if the object is not null 
     if(a != null) { 
      // get the TextView from the ViewHolder and then set the text (item name) and tag (item ID) values 
      viewHolder.codigo.setText(String.valueOf(a.getId())); 
      viewHolder.codigo.setTag(a.getId()); 
      viewHolder.accion.setText(LaAccion.getNombre()); 
      viewHolder.evento.setText(ElEvento.getNombre()); 
      viewHolder.UnSwitch.setChecked(a.getActiva()); 
      Log.e("Position+1: "+ String.valueOf(position+1), "Id: "+ String.valueOf(a.getId())); 


     } 

     viewHolder.isChecked1 = viewHolder.UnSwitch.isChecked(); 
     map.put(position, viewHolder.isChecked1); 
     viewHolder.UnSwitch.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.e("OnClick", "Se clickeó"); 

       listaActions.get(position).setActiva(map.get(position)); 
       Log.e("Listener del switch", "Modificó la action en la lista de la ActividadPrincipal"); 
       int isActiva; 
       if(map.get(position) == true) 
       { 
        isActiva = 0; 
        Log.e("Listener del switch", "isActiva = 1"); 
        map.put(position, false); 
       } else 
       { 
        isActiva = 1; 
        Log.e("Listener del switch", "isActiva = 0"); 
        map.put(position, true); 
       } 
       String query = "UPDATE Actions SET Activa = " + String.valueOf(isActiva) + " WHERE Id = " + String.valueOf(position+1); 
       Log.e("Consulta:", query); 
       Log.e("Listener del switch", "query creado"); 
       Log.e("La position debería ser", String.valueOf(position+1)); 
       Log.e("Y el valor del map.get(position) es", String.valueOf(map.get(position))); 
       ActionsSQLite helper1 = new ActionsSQLite(context, "Actions", null, 1); 
       Log.e("Listener del switch", "Creo el helper"); 
       SQLiteDatabase db = helper1.getWritableDatabase(); 
       Log.e("Listener del switch", "obtenida la base escribible"); 
       db.execSQL(query); 
       Log.e("Listener del switch", "Query ejecutado"); 
      } 
     }); 
     } else 
     { 
      convertView = null; 
     } 


     return convertView; 


    } 
} 
+0

코드를 게시해야합니다. –

+0

이 경우 코드를 게시 할 필요가 없으며 코드에 기반한 대답을 얻을 필요가 없습니다. 원하는 것을 기반으로 대답을 얻어야합니다. 그것은 그것을 할 수있는 코드가 아니라 그것을하는 방법입니다. 어쨌든, 원한다면 내가 올리겠습니다. –

답변

0

당신은 당신이 9 개 항목 (예를 들어) 가지고 ArrayAdapter와 이야기하면 , getView 함수는 9 개의 모든 항목에 대한 뷰를 생성 할 수 있어야합니다. 실제로 해당 항목 중 하나를 어댑터에 표시하지 않으려면 어댑터에서 해당 항목을 제거해야합니다. 그러면 안드로이드는 해당 항목을 표시하기 위해 getView를 호출하지 않습니다.

이 문제를 해결할 수있는 몇 가지 방법이 있습니다. 가장 쉬운 방법은 현재하고있는 것처럼 어댑터를 구성한 다음 포함시키지 않으려는 액션에 remove (action)을 호출하는 것입니다.

또 다른 옵션은 ArrayAdapter 대신 BaseAdapter를 재정의하는 것입니다. 그렇다면 얼마나 복잡한 항목을 표시 할 것인지 동적으로 파악할 수 있습니다. BaseAdapter는보다 유연하지만 여전히 구현하기가 쉽습니다.

의미가 있습니까?

+0

하지만 그건 내가하고있는 일이고 작동하지 않습니다. 삭제 버튼의 onClick에서 보면, arraylist에서 삭제 된 Action의 remove()를합니다 ... –

+0

삭제가 보이지 않습니다 귀하가 게시 한 코드를 호출하십시오. 그러나 어댑터가 아니라 ArrayList에서 제거하는 경우에는 충분하지 않습니다. ArrayAdapter.remove를 호출 한 다음 notifyDatasetChanged를 호출해야합니다. – Bruce

+0

대화 상자에서 해당 코드 외부의 제거를 호출합니다. 그래서 내가 ListActions.remove (인덱스)를 할 때 ActionsAdapter.remove (인덱스)를 수행해야한다고 말하고 있습니까? –