Mit findViewById auf ein recyclerView in anderem Fragment zugreifen?

  • Antworten:9
Baluey
  • Forum-Beiträge: 12

08.11.2017, 18:32:11 via Website

Hi,
ich kenne mich absolut nicht mit Java aus und ich versuche gerade meine erste app zu "entwickeln".

Ich habe jetzt ein tab1_fragment.xml worin sich ein recyclerView befindet worauf ich im MainActivity.java zugreifen möchte, nur wie mache ich das?

Aus einem Tutorial habe ich das interpretiert: recyclerView = (RecyclerView) this.findViewById(R.id.recyclerView);

Da ich aber auf tab1_fragment zugreifen möchte muss ja das "this" durch was anderes ersetzt werden, nur durch was? Oder liege ich hier komplett falsch?

PS: Bitte Infos geben die mir helfen und nicht nur dieses "fang doch lieber mit was einfachen an und nicht mit sowas", das bringt mich auch nicht weiter :/

Antworten
swa00
  • Forum-Beiträge: 3.704

08.11.2017, 18:39:46 via Website

Hallo lerox,

Zur Beantwortung benötigen wir schon genaue Angaben (Source), denn deine Beschreibung ist ein wenig
wirre.

Dann können wir auch sagen, ob du z.b. inflaten musst oder nicht

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Baluey
  • Forum-Beiträge: 12

08.11.2017, 18:49:56 via Website

Ich habe dieses Video benutzt, also bei mir sieht es so ähnlich aus: youtu.be/APInjVO0WkQ?t=27m1s

Nur das ich den RecyclerView jetzt nicht im activity_main.xml habe sondern in tab1_fragment.xml da ich mehrere tabs haben möchte, der Rest ist sonst gleich

— geändert am 08.11.2017, 18:53:02

Antworten
swa00
  • Forum-Beiträge: 3.704

08.11.2017, 19:01:49 via Website

Leroxm

bei aller liebe , ich schau mir keine Videos über Programmierung an :-)

Lernst du eine Fremdsprache mit einem Video , oder weil du dir ein Vokalbuch und ein Grammatikheft
in die Hand nimmst ?

Du musst doch als Programmierer verstehen , was du da machst und schritt für schritt vorgehen und vor
allem LERNEN , was du umsetzt.

Also wenn du irgendwas einfügen magst , dann musst doch wissen wo, wann und wie man es macht.
Dafür gibt es die API Dokumentation - da lesen wir Entwickler ständig nach .
YT Videos ist verlaub gesagt - Schrott

Also poste den Code , den du verändert hast, markiere die Stellen, erkläre warum
und füge das Layout als XML hier hinzu.

— geändert am 08.11.2017, 19:03:11

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Baluey
  • Forum-Beiträge: 12

08.11.2017, 19:47:47 via Website

MainActivity.java

public class MainActivity extends AppCompatActivity {

Toolbar toolbar;
RecyclerView recyclerView;
RssObject rssObject;

//RSS Link
private final String RSS_Link = "ChannelLink";
private final String RSS_to_Json_API = "APILink";


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.d(TAG, "onCreate: Starting.");

recyclerView = (RecyclerView) this.findViewById(R.id.recyclerView); << Hier wird mir ein Error angezeigt da ich den RecyclerView nicht wie im tutorial im activity_main.xml habe sondern im tab1_fragment.xml

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getBaseContext(), LinearLayoutManager.VERTICAL, false);
    recyclerView.setLayoutManager(linearLayoutManager);


    if(!isConnected(MainActivity.this)) buildDialog(MainActivity.this).show();
     else
        loadRSS();



private void loadRSS() {
    AsyncTask<String, String, String> loadRSSAsync = new AsyncTask<String, String, String>() {

        ProgressDialog mDialog = new ProgressDialog(MainActivity.this);

        @Override
        protected void onPreExecute() {
            mDialog.setMessage("Bitte warten...");
            mDialog.show();
        }

        @Override
        protected String doInBackground(String... params) {
            String result;
            HTTPDataHandler http = new HTTPDataHandler();
            result = http.GetHTTPData(params[0]);
            return result;
        }

        @Override
        protected void onPostExecute(String s) {
            mDialog.dismiss();
            rssObject = new Gson().fromJson(s, RssObject.class);
            FeedAdapter adapter = new FeedAdapter(rssObject, getBaseContext());
            recyclerView.setAdapter(adapter);
            adapter.notifyDataSetChanged();
        }
    };

    StringBuilder url_get_data = new StringBuilder(RSS_to_Json_API);
    url_get_data.append(RSS_Link);
    loadRSSAsync.execute(url_get_data.toString());
}

}

tab1fragment.xml

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:minHeight="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:titleTextColor="@android:color/white"/>
<android.support.v7.widget.RecyclerView
    android:padding="8dp"
    android:id="@+id/recyclerView"
    android:layout_below="@id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

Antworten
swa00
  • Forum-Beiträge: 3.704

08.11.2017, 20:23:30 via Website

Du musst schon ein Element nehmen, welches sich im Layout befindet , dass du mit setContentView gesetzt hast.

this kannst du dann weg lassen.

Ich frage mich ,warum du an dieser stelle ein RecycleView haben möchtest , welches sich nicht im aktuellen Layout
befindet. Welchen Zweck soll das haben ??

Du kannst zu Laufzeit ein RecycleView erstellen und das dem Container mit addView hinzufügen
Oder wenn du ein komplettes Layout hinzufügen willst , dann musst du mit Inflate arbeiten

— geändert am 08.11.2017, 20:32:00

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Baluey
  • Forum-Beiträge: 12

08.11.2017, 21:27:21 via Website

Ich habe ein RecycleView im Layout, nur halt im tab1_fragment.xml, das soll auch so sein.
Nur ich weiß jetzt nicht wie ich das MainActivity damit "verknüpfe" sodass nicht das activity_main.xml benutzt wird sondern das tab1_fragment.xml

Ich habe das jetzt so gemacht doch dann crasht die app mit folgendem error:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setAdapter(android.support.v7.widget.RecyclerView$Adapter)' on a null object reference

MainActivity.java

   public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.tab1_fragment, container, false);

        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getBaseContext(), LinearLayoutManager.VERTICAL, false);
        recyclerView.setLayoutManager(linearLayoutManager);


        if (!isConnected(MainActivity.this)) buildDialog(MainActivity.this).show();
        else
            loadRSS();
        return view;
    }

    private void loadRSS() {
        AsyncTask<String, String, String> loadRSSAsync = new AsyncTask<String, String, String>() {

            ProgressDialog mDialog = new ProgressDialog(MainActivity.this);

            @Override
            protected void onPreExecute() {
                mDialog.setMessage("Bitte warten...");
                mDialog.show();
            }

            @Override
            protected String doInBackground(String... params) {
                String result;
                HTTPDataHandler http = new HTTPDataHandler();
                result = http.GetHTTPData(params[0]);
                return result;
            }

            @Override
            protected void onPostExecute(String s) {
                mDialog.dismiss();
                rssObject = new Gson().fromJson(s, RssObject.class);
                FeedAdapter adapter = new FeedAdapter(rssObject, getBaseContext());
                recyclerView.setAdapter(adapter);
                adapter.notifyDataSetChanged();
            }
        };

        StringBuilder url_get_data = new StringBuilder(RSS_to_Json_API);
        url_get_data.append(RSS_Link);
        loadRSSAsync.execute(url_get_data.toString());
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);
        return true;
    }

Antworten
swa00
  • Forum-Beiträge: 3.704

09.11.2017, 08:19:32 via Website

Hallo Lerox,

jetzt hast du zwar den Inflater benutzt, dann solltest du auch das Recycle aus diesem nehmen.
https://developer.android.com/reference/android/view/LayoutInflater.html

Und trotzdem bringt dir das an dieser Stelle gar nichts , weil er nirgendwo sichtbar ist,
kann sich also nicht berechnen und ist somit zwecklos.

— geändert am 09.11.2017, 08:34:00

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Baluey
  • Forum-Beiträge: 12

09.11.2017, 19:30:56 via Website

Ich blicke da nicht durch...

— geändert am 12.11.2017, 20:57:58

Antworten
Baluey
  • Forum-Beiträge: 12

12.11.2017, 20:57:25 via Website

Und wie nehme ich den Recycle aus dem Inflater?

Antworten