2016-07-21 2 views
0

Ich muss die Daten nehmen, die mein Adapter von meiner Aktivität zurückgibt, um es an ein Fragment zu senden, das in einem Viewpager arbeitet.Wie Bundle verwenden, um Daten von Adapter zu einem Fragment in Viewpager zu teilen

Das ist mein Adapter ist, bläht es einige Karten mit Titel und Beschreibungen für Nachrichten

public class FeedAdapter extends CursorAdapter { 

/* 
Etiqueta de Depuración 
*/ 
private static final String TAG = FeedAdapter.class.getSimpleName(); 

/** 
* View holder para evitar multiples llamadas de findViewById() 
*/ 
static class ViewHolder { 
    TextView titulo; 
    TextView descripcion; 

    int tituloI; 
    int descripcionI; 
} 

public FeedAdapter(Context context, Cursor c, int flags) { 
    super(context, c, flags); 

} 

public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 

    View view = inflater.inflate(R.layout.item_layout, null, false); 

    ViewHolder vh = new ViewHolder(); 

    // Almacenar referencias 
    vh.titulo = (TextView) view.findViewById(R.id.titulo); 
    vh.descripcion = (TextView) view.findViewById(R.id.descripcion); 

    // Setear indices 
    vh.tituloI = cursor.getColumnIndex(ScriptDatabase.ColumnEntradas.TITULO); 
    vh.descripcionI = cursor.getColumnIndex(ScriptDatabase.ColumnEntradas.DESCRIPCION); 

    view.setTag(vh); 

    return view; 
} 

public void bindView(View view, Context context, Cursor cursor) { 

    final ViewHolder vh = (ViewHolder) view.getTag(); 

    // Setear el texto al titulo 
    vh.titulo.setText(cursor.getString(vh.tituloI)); 

    // Obtener acceso a la descripción y su longitud 
    int ln = cursor.getString(vh.descripcionI).length(); 
    String descripcion = cursor.getString(vh.descripcionI); 

    // Acortar descripción a 77 caracteres 
    vh.descripcion.setText(descripcion); 


} 
} 

Und das ist das fuction in meiner Tätigkeit, wo ich die viewpager zugleich eine schicke ich erstellen möchten bundle mit der Rückkehr des Adapters

public class LoadData extends AsyncTask<Void, Void, Cursor> { 

     @Override 
     protected Cursor doInBackground(Void... params) { 
      // Carga inicial de registros 
      return FeedDatabase.getInstance(MainActivity.this).obtenerEntradas(); 

     } 

     @Override 
     protected void onPostExecute(Cursor cursor) { 
      super.onPostExecute(cursor); 

      // Crear el adaptador 
      adapter = new FeedAdapter(
        MainActivity.this, 
        cursor, 
        SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); 

      // Relacionar la lista con el adaptador 
      Bundle arguments = new Bundle(); 
      arguments.putString(adapter); 

      viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager(), arguments); 
      viewPager.setAdapter(viewPagerAdapter); 
     } 
    } 

} 

Aber jedesmal, wenn ein ich benutze „arguments.putString“ es gibt mir eine Fehlermeldung. Ich bin verwirrt, weil ich nicht weiß, welche Art von ".put" ich mit den Daten verwenden soll, die ich vom Adapter erhalte und wie Bundle wirklich funktioniert.

Können Sie mir helfen? Danke

+0

Sie können einen Adapter nicht als String in ein Bundle einfügen. Die putString-Methode dient zum Hinzufügen von Strings zu einem Bundle. Was genau willst du senden, ein Objekt oder eine einfache Zeichenfolge? –

+0

Ich möchte die Kartenansicht senden, dass FeedAdapter zu dem Fragment zurückkehrt. Ist das ein Objekt? – mhkore

+0

Sie sollten Ansichten nicht herumreichen. Es ist eine schlechte Übung. Sie könnten wahrscheinlich Daten, die durch den Cursor dargestellt werden, in den ViewPager übergeben. Welche Art von Daten wird durch den Cursor dargestellt? –

Antwort

0

Senden Sie es an die Aktivität und verwenden Sie getIntent(). GetStringExtra ("Name") in Ihr Fragment.

0

Lösung:

Zuerst wird der Adapter Serializable implementiert

public class FeedAdapter extends CursorAdapter implements Serializable{ 

Das Bündel muss das heißt arbeitet

Bundle arguments = new Bundle(); 
arguments.putSerializable("datos",adapter); 

Und ich schicke es meinen viewpager wie diese

viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager(), arguments); 
viewPager.setAdapter(viewPagerAdapter); 

Mein viewPager nimmt die Daten wie folgt

public class ViewPagerAdapter extends FragmentStatePagerAdapter { 
private Bundle data; 

public ViewPagerAdapter(FragmentManager fm, Bundle data) { 
    super(fm); 
    this.data = data; 
} 

@Override 
public Fragment getItem(int position) { 

    TabFragment tab1 = new TabFragment(); 
    tab1.setArguments(data); 

    return tab1; // Which Fragment should be displayed by the viewpager for the given position 
    // In my case we are showing up only one fragment in all the three tabs so we are 
    // not worrying about the position and just returning the TabFragment 
} 

@Override 
public int getCount() { 
    return 3;   // As there are only 3 Tabs 
} 

}

Und schließlich bekommen mein Fragment, das die Argumente und implementiert den Adapter wie diese

public class TabFragment extends ListFragment { 

private Bundle bundle; 
private FeedAdapter adapter; 


@Override 
public void onCreate (Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    bundle = getArguments(); 
    adapter = (FeedAdapter) bundle.getSerializable("datos"); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    super.onCreateView(inflater, container, savedInstanceState); 
    View root = inflater.inflate(R.layout.tabs, container, false); 

    ListView LV = (ListView) root.findViewById(R.id.lista); 
    LV.setAdapter(adapter); 
    return root; 
} 

}

Dank!

Verwandte Themen