2016-03-30 22 views
0

SeekBar'u ListView'a eklemek için özel SimpleCursorAdapter kullanıyorum. Ancak ilerleme değerini TextView'da görüntülenecek şekilde bağlayamıyorum. İşte benim örnek kodum.SimpleCursorAdapter'te SeekBar nasıl eklenir?

class TmpSimpleCursorAdapter extends SimpleCursorAdapter { 
     public TmpSimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) { 
      super(context, layout, c, from, to, flags); 
     } 

     @Override 
     public View newView(Context _context, Cursor _cursor, ViewGroup parent) { 
      LayoutInflater inflater = (LayoutInflater) _context.getSystemService(_context.LAYOUT_INFLATER_SERVICE); 
      View view = inflater.inflate(R.layout.row_item_temperature, parent, false); 
      return view; 
     } 

     @Override 
     public void bindView(View view, Context Context, final Cursor cursor) { 
      //Room name, displaying in ListView Item 
      String title = cursor.getString(cursor.getColumnIndex(DBTemperature.COLUMN_TITLE)); 
      //Set temperature value, adjusting by SeekBar 
      temperature = (TextView) view.findViewById(R.id.roomTemperature); 
      SeekBar seekBar = (SeekBar) view.findViewById(R.id.seekBar); 
      seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
       @Override 
       public void onProgressChanged(SeekBar seekBar, int progressValue, boolean fromUser) { 
        temperature.setText("+" + progressValue); 
        Log.d(MEGA, "Progress Changed"); 
       } 

       @Override 
       public void onStartTrackingTouch(SeekBar seekBar) { 
        Log.d(MEGA, "Progress Started"); 
       } 

       @Override 
       public void onStopTrackingTouch(SeekBar seekBar) { 

        Log.d(MEGA, "Progress Stopped"); 
       } 

      }); 

     } 
    } 

günlükleri bile düzgün çalıştığını gösterir, ancak SeekBar gelen değerler TextView için iletilmesi değildir. Bunun için ViewBinder kullanmalı mıyım? Yoksa kodumda eksik bir şey mi var?

=================================

Sonraki aşama - ViewBinder kullanarak ListView Satırlarını ayarlama yöntemini değiştirdim, ancak hala sorun var. SeekBar ile.

genel sınıf FragmentTemperatureDB Fragman LoaderCallbacks {

ListView lvTemperature; 
DBTemperature dbHelperTmp; 
SimpleCursorAdapter dataAdapterTmp; 
int LIST_TMP_ID = 0; 

ActionMode tmpActionMode; 
private int operatePosition = 0; 
final static String MEGADOR = "megadr"; 

public FragmentTemperatureDB() { 
    // Required empty public constructor 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View vTemperatures = inflater.inflate(R.layout.fragment_thermal, container, false); 
    // Initialize data for ListView 
    dbHelperTmp = new DBTemperature(FragmentTemperatureDB.this.getActivity()); 
    dbHelperTmp.open(); 
    String[] from = new String[] { DBTemperature.COLUMN_TITLE, 
            DBTemperature.COLUMN_CURRENT_TEMP, 
            DBTemperature.COLUMN_ADJUST_TEMP}; 
    int[] to = new int[] { R.id.roomTitleTmp, 
          R.id.roomTemperature, 
          R.id.adjustTemperature}; 
    // Setup Adapter for ListView 
    dataAdapterTmp = new SimpleCursorAdapter(FragmentTemperatureDB.this.getActivity(), 
      R.layout.row_item_temperature, null, from, to, LIST_TMP_ID); 
    dataAdapterTmp.setViewBinder(new SimpleCursorAdapter.ViewBinder() { 
     public boolean setViewValue(View view, Cursor cursor, int columnIndex) { 
      if (columnIndex == cursor.getColumnIndex(DBTemperature.COLUMN_ADJUST_TEMP)) { 
       int adjustProgress = cursor.getInt(columnIndex); 
       SeekBar seekBar = (SeekBar) view.findViewById(R.id.seekBar); 
       ((TextView) view).setText("++" + adjustProgress); 
       seekBar.setProgress(adjustProgress); 
       seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
        @Override 
        public void onProgressChanged(SeekBar seekBar, int progressValue, boolean fromUser) { 
         //((TextView) view).setText("+" + progressValue); 
         Log.d(MEGADOR, "Progress Changed: " + "+" + progressValue); 
        } 
        @Override 
        public void onStartTrackingTouch(SeekBar seekBar) { 
         Log.d(MEGADOR, "Progress Started:"); 
        } 
        @Override 
        public void onStopTrackingTouch(SeekBar seekBar) { 
         Log.d(MEGADOR, "Progress Stopped"); 
        } 
       }); 
       return true; 
      } 
      return false; 
     } 
    }); 
    lvTemperature = (ListView) vTemperatures.findViewById(R.id.temperatureListView); 
    lvTemperature.setAdapter(dataAdapterTmp); 
    setHasOptionsMenu(true); 
    lvTemperature.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int pos, long id) { 
      operatePosition = pos; 
      tmpActionMode = FragmentTemperatureDB.this.getActivity().startActionMode(new ActionBarCallBack()); 

      return true; 
     } 
    }); 
    // Make loader for getting data 
    getLoaderManager().initLoader(LIST_TMP_ID, null, this); 
    // Inflate the layout for this fragment 
    return vTemperatures; 
} 

seekbar işlemi sırasında başlatılır edilemez uygulayan uzanır. Neden yığılmış? I

//((TextView) view).setText("+" + progressValue); 

görünüşüdür iç sınıf içinde erişilemez satır uncomment

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.SeekBar.setProgress(int)' on a null object reference 
                     at com.gigavar.adkmegador01.FragmentTemperatureDB$1.setViewValue(FragmentTemperatureDB.java:69) 

SIRA 69 seekBar.setProgress(adjustProgress);

Aynı zamanda,. Ve bu ikinci bir problem. Veli düzeni aracılığıyla TextView gerekli alıyorum çözülebilir

+0

Görüntüleme tutucusu eklemediniz. Bunu yap ve senin problemini çözeceksin. – chandil03

+0

niçin 'SimpleCursorAdapter' newView' /' bindView' vb. Doğrudan SCA tarafından kullanılamayan görünümler varsa, bir 'SimpleCursorAdapter.ViewBinder' kullanın – pskink

+0

** view holder ekleme ** hiçbir şey değişmedi. Bildiğim gibi, ivme yükleme kaynakları için gerekli. – Prefix

cevap

0

Sorun:

Ayrıca
viewHolder.adjust = (TextView) ((View)seekBar.getParent()).findViewById(R.id.adjustTemperature); 
       viewHolder.adjust.setText("+" + progressValue); 

ViewHolder Sonunda

class TmpSimpleCursorAdapter extends SimpleCursorAdapter { 
    public TmpSimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) { 
     super(context, layout, c, from, to, flags); 
    } 

    ViewHolder viewHolder; 
    @Override 
    public View newView(Context _context, Cursor _cursor, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) _context.getSystemService(_context.LAYOUT_INFLATER_SERVICE); 
     View view = inflater.inflate(R.layout.row_item_temperature, parent, false); 
     return view; 
    } 

    @Override 
    public void bindView(View view, Context Context, final Cursor cursor) { 
     String title = cursor.getString(cursor.getColumnIndex(DBTemperature.COLUMN_TITLE)); 
     viewHolder = new ViewHolder(); 
     viewHolder.roomTitleTmp = (TextView) view.findViewById(R.id.roomTitleTmp); 
     viewHolder.roomTitleTmp.setText(title); 
     viewHolder.temperature = (TextView) view.findViewById(R.id.roomTemperature); 
     viewHolder.adjust = (TextView) view.findViewById(R.id.adjustTemperature); 
     viewHolder.seekBar = (SeekBar) view.findViewById(R.id.seekBar); 
     viewHolder.adjust.setText("+" + viewHolder.seekBar.getProgress()); 
     viewHolder.seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
      @Override 
      public void onProgressChanged(SeekBar seekBar, int progressValue, boolean fromUser) { 
       viewHolder.adjust = (TextView) ((View)seekBar.getParent()).findViewById(R.id.adjustTemperature); 
       viewHolder.adjust.setText("+" + progressValue); 
       Log.d(MEGADOR, "Progress Changed"); 
      } 

      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 
       Log.d(MEGADOR, "Progress Started"); 
      } 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 

       Log.d(MEGADOR, "Progress Stopped"); 
      } 

     }); 

    } 
} 

enter image description here progressValue

görüntüleme ile her satırda seekbar çalışma var
static class ViewHolder { 
    TextView roomTitleTmp; 
    TextView adjust; 
    TextView temperature; 
    SeekBar seekBar; 
} 

takılı