0

Ich versuche, eine einfache Registerkarte Anwendung mit verschiedenen ListViews und Optionen zu machen. Ich möchte die Beziehung zwischen Registerkarten und MainActivity und das Problem im Moment verwalten, kann ich nicht eine AddItem() -Funktion in einer Menüschaltfläche, um ein neues Element zu meiner ListView (innerhalb eines Fragments) in einer Anwendung mit Registerkarten hinzufügen. Ich habe bereits viel gesucht, und ich fand nur über das Hinzufügen eines Elements in einem einfachen ListView (innerhalb MainActivity) oder Hinzufügen von Elementen nicht dynamisch in einer Anwendung mit Registerkarten.ANDROID - Hinzufügen neuer Elemente in einer Fragmentliste (Tabbed) - Android Studio

Also hier ist es der Bildschirm meiner Anwendung mit Registerkarten und der ListView, die ich versuche zu arbeiten. Custom List View Application Picture

[1]: https://i.stack.imgur.com/Ze4eu.png

Und hier ist mein Code: MainActivity.java

public class MainActivity extends AppCompatActivity { 



private SectionsPagerAdapter mSectionsPagerAdapter; 

/** 
* The {@link ViewPager} that will host the section contents. 
*/ 
private ViewPager mViewPager; 

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

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    // Create the adapter that will return a fragment for each of the three 
    // primary sections of the activity. 
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 

    // Set up the ViewPager with the sections adapter. 
    mViewPager = (ViewPager) findViewById(R.id.container); 
    mViewPager.setAdapter(mSectionsPagerAdapter); 

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 
    tabLayout.setupWithViewPager(mViewPager); 

} 

Das Fragment mit dem Custom, dass ich versuche, die Menü-Taste Methode action_add() zu implementieren:

public class Catalogo extends Fragment { 
    ArrayList<CustomList> custom = null; 
    ListView lv = null; 
    ArrayAdapter adapter = null; 
    ArrayList<CustomList> elementos = new ArrayList<CustomList>(); 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.catalogo, container, false); 
     ListView lv = rootView.findViewById(R.id.catalogoListView); 

     custom = addItems(); 
     adapter = new CustomAdapter(this.getContext(), custom); 
     lv.setAdapter(adapter); 

     return rootView; 
    } 

    private ArrayList<CustomList> addItems(){ 
     CustomList custom = new CustomList("Banana", "4.0"); 
     elementos.add(custom); 
     custom = new CustomList("Morango", "5.0"); 
     elementos.add(custom); 
     return elementos; 
    } 

    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(); 


     if (id == R.id.action_add){ 
      AlertDialog.Builder builder = new AlertDialog.Builder(this.getActivity()); 
      //builder.setTitle("Adicionar novo item"); //THESE ARE NOT WORKING 
      //final EditText input = new EditText(this); //THIS SHOULD BE 2 Text Fields 
      //builder.setView(input); 
      builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        //NEED TO IMPLEMENT HERE 
       } 
      }); 
      builder.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.cancel(); 
       } 
      }); 
      builder.show(); 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
    public static String preferredCase(String original, String price) 
    { 
     if (original.isEmpty()) 
      return original; 

     return original.substring(0, 1).toUpperCase() + original.substring(1).toLowerCase(); 
    } 

} 

Meine CustomItem Struktur:

public class CustomList { 
    String name; 
    String price; 
    public CustomList(String name, String price) { 
     this.name = name; 
     this.price = price; 
    } 
    public String getName() { 
     return name; 
    } 
    public String getPrice() { 
     return price; 
    } 
} 

Und am Ende, mein CustomAdapter:

public class CustomAdapter extends ArrayAdapter<CustomList> { 
    private final Context context; 
    private final ArrayList<CustomList> elementos; 

    public CustomAdapter(Context context, ArrayList<CustomList> elementos){ 
     super(context, R.layout.modelolista, elementos); 
     this.context = context; 
     this.elementos = elementos; 
    } 
    public View getView(int position, View convertView, ViewGroup parent){ 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View rowView = inflater.inflate(R.layout.modelolista, parent, false); 

     TextView nameItem = rowView.findViewById(R.id.tvName); 
     TextView priceItem = rowView.findViewById(R.id.tvPrice); 

     nameItem.setText(elementos.get(position).getName()); 
     priceItem.setText(elementos.get(position).getPrice()); 

     return rowView; 
    } 
} 
+0

Sorry, aber ich habe es nicht verstanden .. Sie möchten ein Element zu einer Liste hinzufügen, indem Sie auf einen Menüeintrag klicken und die Liste dieses Eintrags mitteilen, damit die aktualisierte Liste angezeigt werden kann? –

+0

Ja, Sie haben Recht, fügen Sie einen Eintrag in der Liste durch den Menüpunkt hinzu. Das Problem ist .. Ich implementiere die Liste und den Menüpunkt in der MainActivity ... aber ich kann sie nicht in einem Fragment implementieren. Also, es gibt zwei Optionen .. Erstens, implementieren Sie die CustomList und alle Menü-Schaltflächen in der MainActivity, aber dann weiß ich nicht, wie diese "made Custom List" an das Fragment (in "Catalogo" Registerkarte). Zweitens ist, implementieren Sie alles innerhalb des Fragments (Registerkarte "Catalogo"), aber dann kann ich nicht die Schaltfläche Funktionen wie ich in MainActivity implementieren. –

+0

ok hab ich, nur zu wissen: du siehst den "hinzufügen" button nur wenn das katalogfragment angezeigt wird oder du es immer siehst? –

Antwort

0

Der beste Weg, Aktivität Daten in Fragmente zu verwenden, ist eine Schnittstelle in Fragmente zu erstellen und in Aktivitätsklasse

public class Catalogo extends Fragment { 
    private CatalogFragmentInteface catalogInterface; 
    //rest of your code 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      View rootView = inflater.inflate(R.layout.catalogo, container, false); 
      catalogIntreface.catalogInterfaceFunction(rootView); 
    } 
@Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     if (context instanceof CatalogFragmentInterface) { 
      catalogInterface = (CatalogFragmentInterface) context; 
     } else { 
      throw new RuntimeException(context.toString() 
        + " must implement CatalogFragmentInterface"); 
     } 
    } 

    interface CatalogFragmentInterface { 
     void catalogInterfaceFunction(View view); 
    } 
    } 

implementieren und Implementieren Sie diese Schnittstelle in der Aktivitätsklasse

public class MainActivity extends AppCompatActivity implement Catalog.CatalogFragmentInterface{ 
@Overide 
void catalogInterfaceFunction(View view) { 
    //access your listview in fragment using view variable 
} 
} 

Auf diese Weise sind alle Ihre Daten und Listenansicht in derselben Klasse vorhanden. Ich hoffe, das wird dir jetzt helfen.

+0

Ich habe meine Antwort bearbeitet –

+0

Oh Entschuldigung, ich habe das nicht bemerkt, ich habe diese Antwort hier geschrieben. Sie können den Variablennamen ändern –

+0

Yeah ich vermasselt, wenn Sie Ihren und meinen Code mischen, jetzt ist es von meiner Seite getan. Entschuldigen Sie die Unannehmlichkeiten. –

0

Zuerst ein Vorschlag: Anstatt Ihren Artikel CustomList anzurufen, erwägen Sie, ihn CustomListItem zu nennen. Auf diese Weise werden Sie sich in Zukunft leicht daran erinnern, dass es sich um einen Gegenstand und nicht um eine Liste handelt.

Das heißt, Sie sollten ein Add Page \ Dialog implementieren.

Es gibt viele Möglichkeiten, dies zu tun .. der "beste Ansatz" (ich denke) wird einen benutzerdefinierten hinzufügen Dialog erstellen. So werden Sie ein eigenes Layout erstellen müssen und geben sie als die Sicht auf Ihr Layout mit etwas wie folgt aus:

AlertDialog.Builder builder = new AlertDialog.Builder(activity); 
LayoutInflater inflater = activity.getLayoutInflater(); 
View dialogView = inflater.inflate(R.layout.my_custom_view, null); 
builder.setView(dialogView); 

Jetzt können Sie einfach alle listners implementieren und stopft hier, indem sie Gegenstände wie Button byButton = (Button)dialogView.getItemById(R.id.mybutton);

Für jeder Info-Check this answer, die Ihnen helfen könnte (es gibt viele andere).

Nun, was wir vermissen die Listenansicht ist erfrischend, das ich denke, ist die einfachste Art und Weise:

Sie können eine Referenz Ihrer benutzerdefinierten Fragment in Ihrem Activity speichern. Dann fügen Sie in Ihrem eine Methode wie AddItemToList() hinzu.Nun, wenn der Benutzer klickt auf die Schaltfläche "Hinzufügen", können Sie diese Methode aus dem Fragmentverweis aufrufen und das Verfahren, wie unten implementieren (+ -):

Rückruf (MainActivity)

//add this param 
private MyFragment myFragment; 

//when you show the fragment add this: 
myFragment = myFragmentIstance; 

//on the save of the dialog, add this: 
//do all checks and create item 
CustomListItem cli = new CustomListItem(editTextName.getText().toString(), editTextPrice.getText().toString()); 
myFragment.AddItemToList(cli); 

AddItemToList (Fragment):

public void AddItemToList(CustomListItem cli){ 
    myCustomListItemList.Add(cli); 
    myAdapterView.notifyDataSetChanged(); 
} 

So etwas sollte funktionieren .. Für weitere Fragen oder explaination ich hier bin. Viel Glück

+0

Sollte der Callback nicht 'onAttach' im Fragment sein ? –

Verwandte Themen