2016-08-11 2 views
0

У меня есть ListView с элементами в моем фрагменте. Каждый элемент имеет счетчик, напримерОбновить фрагмент из адаптера

Item 1 - 4 Пункт 2 - 5 На верхней части фрагмента я имею TextView с суммой всех элементов: сумма - 9. Я могу удалить элемент с щелчком на изображении по данному вопросу ряд. В адаптере (GetView()) это выглядит следующим образом:

final LinearLayout delete = (LinearLayout)dialog.findViewById(R.id.delete_layout); 
        delete.setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          mParts.remove(part); 
          notifyDataSetChanged(); 
          dialog.dismiss(); 
        } 
       }); 

Товар удаляется из списка, но счетчик не изменяет значение - например, Пункт 2 был удален, но счетчик все еще показывает 5. Я обновить его в onResume(), и он работает, но только если я оставлю фрагмент и вернусь к нему. Я пытаюсь написать метод обновления в фрагменте и использовать его в адаптере - я создал конструктор с фрагментом:

public PartAdapter(Context context, int resource, List objects, InvActivity mActivity,InvFragment mFragment) { 
     super(context, resource,objects); 
     this.mParts = objects; 
     mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     this.mActivity=mActivity; 
     this.mFragment = mFragment; 
    } 

но когда я называю fragment.something я получаю исключение нулевой точки:/Как я могу обновить фрагмент/счетчик TextView из адаптер? Я также попытался снова установить фрагмент, но он не работает.

Часть моего адаптера (это довольно долго)

public class PartAdapter extends ArrayAdapter { 
    private OnUpdateListener listener; 
    public interface OnUpdateListener { 
     void onUpdate(String text); 
    } 

public void setOnUpdateListner(OnUpdateListener listener) { 
    this.listener = listener; 
} 

private List<Part>mParts; 
private LayoutInflater mInflater; 
private TextView mPartName; 
public CheckBox mState; 
private ImageView mActionArrow; 
public static final String TAG = PartAdapter.class.getSimpleName(); 
private static final int CAM_REQUEST = 1313; 
private InvActivity mActivity; 
private AdapterCallback mAdapterCallback; 
private TextView mCounter; 
private ImageView mDelete; 
private InvFragment mFragment; 
public boolean shouldScan = true; 

private final byte[] pal = new byte[]{ 
     (byte) 0xDA, (byte) 0xAD, // const 
     (byte) 0x04, (byte) 0x74, (byte) 0x31, // com 
     (byte) 0xe7, (byte) 0x64 //last 

}; 
private final byte[] readId = new byte[]{ 
     (byte) 0xDA, (byte) 0xAD, // const 
     (byte) 0x04, (byte) 0x6f, (byte) 0x69, // com 
     (byte) 0xec, (byte) 0x6e //last 


}; 
private UsbManager usbManager; 
private UsbDevice device; 
public List<String> codes; 




public PartAdapter(Context context, int resource, List objects, InvActivity mActivity,AdapterCallback callback) { 
    super(context, resource,objects); 
    this.mParts = objects; 
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    this.mActivity=mActivity; 
    this.mAdapterCallback = callback; 
} 
public PartAdapter(Context context, int resource, List objects, InvActivity mActivity,InvFragment mFragment) { 
    super(context, resource,objects); 
    this.mParts = objects; 
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    this.mActivity=mActivity; 
    this.mFragment = mFragment; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    if(convertView == null) 
     convertView=mInflater.inflate(R.layout.part_item,parent,false); 
    mState = (CheckBox) convertView.findViewById(R.id.state_chb); 
    mDelete = (ImageView)convertView.findViewById(R.id.delete_car); 
    mDelete.setVisibility(View.INVISIBLE); 


    final Part party = mParts.get(position); 
    if(party.isScan() || party.getType().contentEquals("2")) { 
     mState.setChecked(true); 
    } else if (!party.isScan()){ 
     mState.setChecked(false); 
    } 
    if(party.getType().contentEquals("2")) 
     mDelete.setVisibility(View.VISIBLE); 


    if(mParts.get(position).getClass().isInstance(new Part())) { 
     final Part part = (Part) mParts.get(position); 
     mPartName = (TextView)convertView.findViewById(R.id.car_name_tv); 
     mState = (CheckBox) convertView.findViewById(R.id.state_chb); 
     mPartName.setText(part.getName()); 
     mActionArrow = (ImageView)convertView.findViewById(R.id.arrow_action); 
     mCounter = (TextView)convertView.findViewById(R.id.car_count_tv); 
     mCounter.setText(part.getQuantity()); 
     if(!part.isScan()) { 
      mState.setChecked(false); 
     } else if(part.isScan() || part.getType().contentEquals("2")) { 
      mState.setChecked(true); 
     } 

     mActionArrow.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       final Dialog dialog = new Dialog(getContext()); 
       dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 

       dialog.setContentView(R.layout.dialog_context_menu); 

       final LinearLayout delete = (LinearLayout)dialog.findViewById(R.id.delete_layout); 
       delete.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         int totalSum = 5; 
         int partValue = 2; 
         mParts.remove(part); 
         notifyDataSetChanged(); 
         dialog.dismiss(); 
         if(listener != null){ 
          listener((totalSum - partValue).toString()); 
         } 

        } 
       }); 
       LinearLayout photo = (LinearLayout)dialog.findViewById(R.id.photo_layout); 
       photo.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         mActivity.dispatchTakePictureIntent(); 

        } 
       }); 
       LinearLayout note = (LinearLayout)dialog.findViewById(R.id.note_layout); 
       note.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         dialog.dismiss(); 
         final Dialog noteDialog = new Dialog(getContext()); 
         noteDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
         noteDialog.setContentView(R.layout.dialog_note); 
         final EditText noteET = (EditText)noteDialog.findViewById(R.id.note_et); 
         if(!part.getNote().contentEquals("null")) 
          noteET.setText(part.getNote()); 
         Button save = (Button)noteDialog.findViewById(R.id.save_button); 
         save.setOnClickListener(new View.OnClickListener() { 
          @Override 
          public void onClick(View v) { 
           part.setNote(noteET.getText().toString()); 
           noteDialog.dismiss(); 
          } 
         }); 
         noteDialog.show(); 
         Button cancel = (Button) noteDialog.findViewById(R.id.cancel_button); 
         cancel.setOnClickListener(new View.OnClickListener() { 
          @Override 
          public void onClick(View v) { 
           noteDialog.dismiss(); 
          } 
         }); 

        } 
       }); 

       LinearLayout values = (LinearLayout)dialog.findViewById(R.id.values_layout); 
       values.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         final Dialog noteDialog = new Dialog(getContext()); 
         noteDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
         noteDialog.setContentView(R.layout.dialog_note); 
         final EditText noteET = (EditText)noteDialog.findViewById(R.id.note_et); 
         noteET.setInputType(InputType.TYPE_CLASS_NUMBER); 
         Button save = (Button)noteDialog.findViewById(R.id.save_button); 
         save.setOnClickListener(new View.OnClickListener() { 
          @Override 
          public void onClick(View v) { 
           part.setQuantity(noteET.getText().toString()); 
           noteDialog.dismiss(); 
           dialog.dismiss(); 
          } 
         }); 
         noteDialog.show(); 
         Button cancel = (Button) noteDialog.findViewById(R.id.cancel_button); 
         cancel.setOnClickListener(new View.OnClickListener() { 
          @Override 
          public void onClick(View v) { 
           noteDialog.dismiss(); 
           dialog.dismiss(); 
          } 
         }); 
        } 
       }); 

       dialog.show(); 
      } 
     }); 

    } 


    return convertView; 
} 

и от моей деятельности:

public void onUpdate(String value){ 
     mCountTV.setText(value); 
    } 

private void createAdapter() { 
    adapter.setOnUpdateListner(this); 
} 

}

+1

пытается добавить интерфейс в адаптере, чем улов удалить обратный вызов в вашем фрагменте и обновлении TextView –

ответ

1

Вы можете следить за процессом, как показано ниже.

В вашем PartAdapter установить слушателя, который будет реализован в Фрагменте, используемом для обновления значения sum текстового вида.

class PartAdapter { 
    private OnUpdateLitener listener; 

    public interface OnUpdateListener { 
     void onUpdate(String text); 
    } 

    public void setOnUpdateListner(OnUpdateListener listener) { 
     this.listener = listener; 
    } 

    // in your getView() method 
    final LinearLayout delete = (LinearLayout)dialog.findViewById(R.id.delete_layout); 
       delete.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         mParts.remove(part); 
         notifyDataSetChanged(); 
         if(listener != null){ 
          listener.onUpdate(String.valueOf(totalSum - partValue)); 
         } 
         dialog.dismiss(); 
       } 
      }); 
} 

В вашем фрагменте

class MyFragment { 

    private OnUpdateListener listener; 

    void onAttach(Activity activity){ 
     if(!(activity instaceof PartAdapter.OnUpdateListener)){ 
      throw new IllegalStateException("Must implement OnUpdateListener"); 
     } 
     listener = (PartAdapter.OnUpdateListener) activity; 

    } 

    private void createAdapter() { 
     PartAdapter adapter = new PartAdapter(getContext(), R.layout.part_item, mParts, mActivity, new AdapterCallback() { 
      @Override 
       public void onMethodCallback() { 
        Log.e(TAG, "onMethodCallback: "); 
       } 
      }); 
      adapter.setOnUpdateListener(this); 
      mPartsLV.setAdapter(adapter); 
    } 
} 

В вашей деятельности

class MainActivity implements PartAdapter.OnUpdateListener { 

    public void onUpdate(String value){ 
      textView.setText(value); 
    } 
} 
+0

Это не работает. Я сделал точно так, как вы описываете, но не имеет ответа во фрагменте:/ – Bartos

+0

Поделитесь своим фрагментом и классом адаптера теми, которые вы только что попробовали. –

+0

Я отредактировал мое сообщение. Проблема также заключается в прослушивании строки ((totalSum - partValue) .toString()); - toString помечен как не может быть разрешен. totalSum и partValue Я установил по умолчанию, чтобы проверить, работает ли он :) – Bartos

Смежные вопросы