2016-08-11 1 views
0

У меня есть основная деятельность, которая содержит фрагменты. Один из фрагментов вызывает диалог dialogFragment для ввода нового элемента. Этот новый элемент задается классом Serializable. Просто чтобы быть более точным: item.javaРезультаты передачи (сериализуемый класс) из DialogFragment to Fragment

public class Item implements Serializable { 
private String mTitle; 
private String mDescription; 
private Boolean mTrue; 


//getters and setters 

public String getTitle() { 
    return mTitle; 
} 
public void setTitle(String mTitle) { 
    this.mTitle = mTitle; 
} 
public String getDescription() { 
    return mDescription; 
} 
public void setDescription(String mDescription) { 
    this.mDescription = mDescription; 
} 
public Boolean isTrue() { 
    return mTrue; 
} 
public void setTrue(Boolean mTrue) { 
    this.mTrue = mTrue; 
} 
} 

DialogNewItem

public class DialogNewItem extends DialogFragment { 


//filters state holder 
Boolean isTrue = false; 
//filters state end 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState){ 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    LayoutInflater inflater = getActivity().getLayoutInflater(); 
    View dialogView = inflater.inflate(R.layout.new_item, null); 

    final EditText editTitle = (EditText) dialogView.findViewById(R.id.editTitle); 
    final EditText editDescription = (EditText) dialogView.findViewById(R.id.editDescription) 

    //filter icons 
    final ImageView ivIsTrue = (ImageView) dialogView.findViewById(R.id.filterTrue); 
    //filter icons end 

    //onClickListener for filter icons 
    ivIsTrue.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v){ 
      if (isTrue == false) { 
       ivIsTrue.setBackgroundResource(R.drawable.border_white); 
       ivIsTrue.setImageResource(R.drawable.true_white); 
       isTrue = true; 
      } else { 
       ivIsTrue.setBackgroundResource(R.drawable.border_green); 
       ivIsTrue.setImageResource(R.drawable.true_green); 
       isTrue = false; 
      } 
     } 
    }); 


    Button btnCancel = (Button) dialogView.findViewById(R.id.btnCancel); 
    Button btnOK = (Button) dialogView.findViewById(R.id.btnOK); 


    builder.setView(dialogView); 

    //cancel button 
    btnCancel.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v){ 
      dismiss(); 
     } 
    }); 

    //give button 
    btnOK.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 


      //new item 
      final Item newItem = new Item(); 

      //Set its variables to match the users entries on the form 
      newItem.setTitle(editTitle.getText().toString()); 
      newItem.setDescription(editDescription.getText().toString()); 
      newItem.setTrue(isTrue); 



      dismiss(); 
     } 
    }); 
    return builder.create(); 
} 

}

Теперь я хочу передать newItem от DialogNewItem (btnOK) в ListView фрагмента. Другими словами, я хочу создать фрагмент ListView, который будет содержать все новые элементы, созданные в DialogNewItem. Я пытался использовать разные методы (set/getFragment, ArrayList, различные интерфейсы и т. Д.), Но некоторые из них не работают. У меня нет никаких проблем с переходом newItem к ListView в деятельности:

//get the reference to dashboard 
Dashboard callingActivity = (Dashboard) getActivity(); 
//pass new item back to dashboard 
callingActivity.createNewItem(newItem); 

, а затем приборной панели деятельности:

public class Dashboard extends AppCompatActivity { 

private ItemAdapter mItemAdapter; 

public void createNewItem(Item n) { 
    mItemAdapter.addItem(n); 
} 

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

    mItemAdapter = new ItemAdapter(); 
    ListView listItem = (ListView) findViewById(R.id.listView); 
    listItem.setAdapter(mItemAdapter); 
} 

//handle clicks on listView 
listItem.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
    @Override 
    public void onItemClick (AdapterView<?> adapter, View view, int whichItem, long id){ 
     //creating temporary item which is reference to the clicked item 
     Item tempItem = mItemAdapter.getItem(whichItem); 
     //new dialog window 
     DialogShowItem dialog = new DialogShowItem(); 
     //send reference to the item to be shown 
     dialog.sendItemSelected(tempItem); 
     //show the dialog window with the item 
     dialog.show(getFragmentManager(),""); 
    } 
}); 

@Override 
public View getView(int whichItem, View view, ViewGroup viewGroup){ 
    //has been inflated already 
    if (view==null){ 
     //creating layout inflater 
     LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     //instantiate view by inflating inflater (listItem layout) 
     view = inflater.inflate(R.layout.listitem, viewGroup, false); 
    } 

    Item tempItem = itemList.get(whichItem); 

    //grabbing the refrence to all variables 
    TextView txtTitle = (TextView) view.findViewById(R.id.txtTitle); 
    TextView txtDescription = (TextView) view.findViewById(R.id.txtDescription); 

    ImageView ivTrue = (ImageView) view.findViewById(R.id.imgSmTrue); 


    //setting text variables 
    txtTitle.setText(tempItem.getTitle()); 
    txtDescription.setText(tempItem.getDescription()); 

    //hide not relevant images 
    if (!tempItem.isTrue()){ 
     ivTrue.setVisibility(View.INVISIBLE); 
    } else {ivTrue.setVisibility(View.VISIBLE);} 
    //category with different image src 


    return view; 
} 

и все работает отлично, но когда я хочу сделать то же самое с фрагментом вместо деятельности , почему-то я не могу заставить его работать. Буду признателен за любую помощь. Thanx

Фрагмент (с ListView): ListItems общественного класса распространяется ListFragment {

private ItemAdapter mItemAdapter; 

public void createNewItem(Item i) { 
    mItemAdapter.addItem(i); 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstatceState) { 
    View view = inflater.inflate(R.layout.list_items, container, false); 

    //Item adapter 
    mItemAdapter = new ItemAdapter(); 
    final ListView listItems = (ListView) view.findViewById(R.id.listView); 
    listItems.setAdapter(mItemAdapter); 


    //floating give button 
    FloatingActionButton fab = (FloatingActionButton) view.findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      DialogNewItem dialog = new DialogNewItem(); 
      dialog.show(getFragmentManager(), ""); 
     } 
    }); 

    //handle clicks on itemList 
    listItems.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int whichItem, long id) { 
      Item tempItem = mItemAdapter.getItem(whichItem); 
      DialogShowItem dialog = new DialogShowItem(); 
      dialog.sendItemSelected(tempItem); 
      dialog.show(getFragmentManager(), ""); 
     } 
    }); 

    return view; 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    mItemAdapter.saveItems(); 
} 

public class ItemAdapter extends BaseAdapter { 
    List<Item> itemList = new ArrayList<Item>(); 

    private JSONSerializer mSerializer; 

    public ItemAdapter() { 
     mSerializer = new JSONSerializer("myProject.json", getActivity().getApplicationContext()); 
     try { 
      itemList = mSerializer.load(); 
     } catch (Exception e) { 
      itemList = new ArrayList<Item>(); 
      Log.e("Error loading items: ", "", e); 
     } 
    } 

    public void saveItems() { 
     try { 
      mSerializer.save(itemList); 
     } catch (Exception e) { 
      Log.e("Error saving items: ", "", e); 
     } 
    } 

    @Override 
    public int getCount() { 
     return itemList.size(); 
    } 

    @Override 
    public Item getItem(int whichItem) { 
     return itemList.get(whichItem); 
    } 

    @Override 
    public long getItemId(int whichItem) { 
     return whichItem; 
    } 

    public void addItem(Item n) { 
     itemList.add(n); 
     notifyDataSetChanged(); 
    } 

    @Override 
    public View getView(int whichItem, View view, ViewGroup viewGroup) { 
     if (view==null) { 
      LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view = inflater.inflate(R.layout.list_items, viewGroup, false); 
     } 

     Item tempItem = itemList.get(whichItem); 

     TextView txtTitle = (TextView) view.findViewById(R.id.txtTitle); 
     TextView txtDescription = (TextView) view.findViewById(R.id.txtDescription); 

     ImageView ivTrue = (ImageView) view.findViewById(R.id.imgSmTrue); 

     //setting text variables 
     txtTitle.setText(tempItem.getTitle()); 
     txtDescription.setText(tempItem.getDescription()); 

     //hide irrelevant images 
     if (!tempItem.isTrue()){ 
      ivTrue.setVisibility(View.INVISIBLE); 
     } else {ivTrue.setVisibility(View.VISIBLE);} 

     return view; 
    } 

} 
} 

Это ящик деятельности, так что я показываю его после того, как ящик нажмём:

private void switchFragment(int position) { 
Fragment fragment = null; 
    String fragmentID = ""; 
    switch (position) { 
     case 0: 
      fragmentID = "LISTITEMS"; 
      fragment = new ListItems(); 
      break; 
     case 1: 
      fragmentID = "PROFILE"; 
      fragment = new Profile(); 
      break; 
     default: 
      break; 
    } 
    FragmentManager fragmentManager = getFragmentManager(); 
    fragmentManager.beginTransaction().replace(R.id.fragmentHolder, fragment, fragmentID).commit(); 
    //close the drawer 
    mDrawerLayout.closeDrawer(mNavDrawerList); 
} 

ответ

0

Вы можете сделать открытый метод в классе фрагментов ListItems, в котором вы получаете объект класса Item и добавляете его в адаптер. А затем внутри фрагмента DialogNewItem, нажав кнопку «ОК», вы можете выполнить поиск в ListItems с помощью SupportFragmentManager с помощью его тега и вызвать публичный метод, который вы написали.

Следующий код может вам помочь.

DialogNewItem класс

btnOK.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //new item 
      final Item newItem = new Item(); 

      //Set its variables to match the users entries on the form 
      newItem.setTitle(editTitle.getText().toString()); 
      newItem.setDescription(editDescription.getText().toString()); 
      newItem.setTrue(isTrue); 

      FragmentManager manager = getActivity().getSupportFragmentManager(); 

      ListItems fragment = (ListItems)manager.findFragmentByTag("LISTITEMS"); 

      if(fragment != null){ 
       fragment.createNewItem(newItem); 
      }    

      dismiss(); 
     } 
    }); 

В вашем ListItems фрагментировать следующий код будет изображать ItemAdapter в качестве элемента данных класса ListViewFragment и ниже, что это метод, который вы можете позвонить, чтобы добавить элемент в адаптере.

private ItemAdapter mItemAdapter; 

public void createNewItem(Item n) { 
    mItemAdapter.addItem(n); 
} 
+0

Thankx, но будет ли ListViewFragment выглядеть? – bart

+0

Прошу прощения, я не получил то, что спросил. Удалось ли решить проблему? –

+0

Извините, мне просто интересно, как этот открытый метод и адаптер выглядят в ListViewFragment? – bart

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