14

Sto lavorando ad un progetto Android in cui sto usando il framework 'SuperSlim' per creare una griglia di Notes (classe Custom) insieme ai dati da visualizzare . Le note nel database hanno una relazione molti-a-uno con Sezioni (classe personalizzata). E le sezioni a loro volta hanno una relazione molti-a-uno con Canvas.Android: Mettere Griglia di oggetti dinamici e personalizzati all'interno di un'altra Griglia di oggetti dinamici e personalizzati

Tutte le informazioni per la sezione, le note vengono richiamate dinamicamente dal server come elenco.

Ora sono al punto, in cui sono in grado di visualizzare una vista Griglia delle sezioni, e mettere le informazioni di testo nella griglia come Sezione-nome, ecc Per il test, fini, ho anche inserito staticamente testo Estratto da una nota. Sono nuovo alla programmazione Android, quindi per favore non importa se il codice sembra incasinato.

Ora questi sono i problemi che sto affrontando:

1) Come visualizzare una griglia di sezioni e all'interno di ogni sezione visualizzata, Vorrei visualizzare una griglia di Notes. Poiché esiste una relazione uno-a-molti, possono esserci molte note per sezione. Questo è il mio problema principale

2) Con la visualizzazione di quanto sopra, vorrei mantenere il campo SectionName modificabile, e ho un metodo REST con cui posso modificare il nome della sezione, ma richiedo anche l'id della sezione. È disponibile su clic, vorrei mantenerlo.

3) La griglia di note visualizzata all'interno di una sezione dovrebbe essere selezionabile, quindi in seguito posso aprire qualcosa di simile a Modal, in modo che l'utente possa leggere l'intera nota e modificarla.

Il sotto screenshot indica la mia situazione attuale:

Screenshot Il cellulare lato sinistro era l'originale come Lista Griglia Sezioni dovrebbe essere simile. L'ho modificato, per visualizzare più informazioni, solo per test, e usando SuperSlim per aggiungere informazioni un po 'più correttamente.

Si prega di notare, attualmente nel codice, sto chiamando staticamente il metodo NotesList per una sezione hardcoded. Questo non è desiderato. Infine codice:

GroupSectionActivity:

public class GroupSectionActivity extends ActionBarActivity { 

    private SectionServiceImpl sectionService = new SectionServiceImpl(); 

    private static volatile List<RestSection> restSectionList = new ArrayList<>(); 

    private static volatile Long groupAccountId; 

    private static volatile Integer canvasid; 

    static final String msectionname = "msectionname"; 
    static final String msectionid = "msectionid"; 

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

     Bundle extras = getIntent().getExtras(); 
     if (extras != null) { 
      groupAccountId = extras.getLong("groupid"); 
      canvasid = extras.getInt("canvasid"); 
     } 

     if(savedInstanceState == null){ 
      getFragmentManager().beginTransaction().add(R.id.container, new NoteFragments(), "msectionname").commit(); 
     } 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     if(toolbar!=null){ 
      setSupportActionBar(toolbar); 
     } 

     restSectionList = this.sectionService.getSectionByCanvas(canvasid); 

     ArrayList<HashMap<String, String>> restSectionArrayList = new ArrayList<HashMap<String, String>>(); 
     for (RestSection restSection : restSectionList) { 

      HashMap<String, String> sectionDisplay = new HashMap<>(); 
      sectionDisplay.put("msectionid", String.valueOf(restSection.getMsectionid())); 
      sectionDisplay.put("msectionname", restSection.getMsectionname()); 
      restSectionArrayList.add(sectionDisplay); 
     } 

     /* listView = (ListView) findViewById(R.id.seclist); 

     sectionLazyAdapter = new SectionLazyAdapter(this, restSectionArrayList); 

     listView.setAdapter(sectionLazyAdapter); 

     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
            int position, long id) { 
       int sectionId = restSectionList.get(position).getMsectionid(); 
       Log.d("Sectionid is ", String.valueOf(sectionId)); 
       *//*Intent intent = new Intent(GroupSectionActivity.this, GroupSectionActivity.class); 
       intent.putExtra("groupid", groupAccountId); 
       intent.putExtra("sectionid", sectionId); 
       startActivity(intent); 
       finish();*//* 

      } 
     }); 

     addSectionButton = (Button) findViewById(R.id.sectionAddButton); 
     addSectionButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       int val = addGroupSection(); 
       if (val == 0) { 
        sectionName.setError("Section Name cannot be null"); 
       } else { 
        sectionName.clearComposingText(); 
        sectionName.clearAnimation(); 
        sectionName.setText(""); 
        Toast.makeText(getApplicationContext(), "Section added", Toast.LENGTH_LONG).show(); 
       } 
      } 
     });*/ 

    } 

    public Integer addGroupSection(){ 
    /* sectionName = (EditText) findViewById(R.id.sectionNameTextField); 
     if (!(sectionName.getText().toString().isEmpty())) { 
      RestSection restSection = new RestSection(); 
      restSection.setMsectionname(sectionName.getText().toString()); 
      return this.sectionService.addGroupSection(restSection,canvasid); 
     } 
*/ 
     return 0; 
    } 

    @Override 
    public void onBackPressed() { 
     Intent intent = new Intent(GroupSectionActivity.this, GroupCanvasActivity.class); 
     intent.putExtra("groupid", groupAccountId); 
     startActivity(intent); 
     finish(); 
    } 

    private NoteFragments getSectionsFragment() { 
     return (NoteFragments) getFragmentManager().findFragmentByTag(msectionname); 
    } 
} 

SectionLazyAdapter:

public class SectionLazyAdapter extends BaseAdapter{ 

    private Activity activity; 
    private ArrayList<HashMap<String, String>> data; 
    private static LayoutInflater inflater=null; 

    public SectionLazyAdapter(Activity a, ArrayList<HashMap<String, String>> d) { 
     activity = a; 
     data=d; 
     inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public int getCount() { 
     return data.size(); 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     View vi=convertView; 
     if(convertView==null) 
      vi = inflater.inflate(R.layout.activity_group_section, null); 

     TextView sectionName = (TextView)vi.findViewById(R.id.sectionname); // title 
     HashMap<String, String> sectionList = new HashMap<String, String>(); 
     sectionList = data.get(position); 

     sectionName.setText(sectionList.get(GroupSectionActivity.msectionname)); 

     return vi; 
    } 
} 

NoteAdapters:

public class NoteAdapters extends RecyclerView.Adapter<NoteViewHolder> { 

    private NoteServiceImpl noteService = new NoteServiceImpl(); 

    private static final int LINEAR = 0; 

    private final Context mContext; 

    private SectionServiceImpl sectionService = new SectionServiceImpl(); 

    List<RestSection> restSectionList = new ArrayList<>(); 


    private final ArrayList<LineItem> mItems; 

    public NoteAdapters(Context context, int headermode) { 
     mContext = context; 

     int sectionManager = -1; 

     int sectionFirstPosition = 0; 

     mItems = new ArrayList<>(); 

     restSectionList = this.sectionService.getSectionByCanvas(2500); 

     for (int i = 0; i < restSectionList.size(); i++) { 
      String header = restSectionList.get(i).getMsectionname(); 
      RestNote restNote = this.noteService.getFirstNoteForSection(restSectionList.get(i).getMsectionid()); 
      mItems.add(new LineItem(header, true, sectionManager, sectionFirstPosition, restNote.getMnotetext())); 

     } 
    } 

    @Override 
    public NoteViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view; 
     view = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_group_section, parent, false); 
     return new NoteViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(NoteViewHolder holder, int position) { 
     final LineItem item = mItems.get(position); 
     final View itemView = holder.itemView; 
     holder.bindText(item.text); 
     holder.bindNoteData(item.otherText); 
     final GridSLM.LayoutParams lp = GridSLM.LayoutParams.from(itemView.getLayoutParams()); 

     lp.setSlm(item.sectionManager == LINEAR ? LinearSLM.ID : GridSLM.ID); 
     lp.setColumnWidth(mContext.getResources().getDimensionPixelSize(R.dimen.grid_column_width)); 
     lp.setFirstPosition(item.sectionFirstPosition); 
     itemView.setLayoutParams(lp); 
    } 

    @Override 
    public int getItemCount() { 
     return mItems.size(); 
    } 

    /* @Override 
    public void onClick(View v) { 
     if(v instanceof ImageView){ 
      Log.d("Image","Clicked"); 
     } else { 
      Log.d("Text","Clicked"); 
     } 
    }*/ 

    private static class LineItem { 

     public int sectionManager; 

     public int sectionFirstPosition; 

     public boolean isHeader; 

     public String text; 

     public String otherText; 

     public LineItem(String text, boolean isHeader, int sectionManager, 
         int sectionFirstPosition, String otherText) { 
      this.isHeader = isHeader; 
      this.text = text; 
      this.sectionManager = sectionManager; 
      this.sectionFirstPosition = sectionFirstPosition; 
      this.otherText = otherText; 
     } 
    } 
} 

NoteFragments:

public class NoteFragments extends Fragment { 

    private ViewHolder mViews; 

    private NoteAdapters noteAdapters; 

    private int mHeaderDisplay; 

    private boolean mAreMarginsFixed; 

    private Random mRng = new Random(); 

    private Toast mToast = null; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.section_fragment, container, false); 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     mViews = new ViewHolder(view); 
     mViews.initViews(new LayoutManager(getActivity())); 
     noteAdapters = new NoteAdapters(getActivity(), mHeaderDisplay); 
     mViews.setAdapter(noteAdapters); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState){ 
     super.onSaveInstanceState(outState); 
    } 

    private static class ViewHolder { 

     private final RecyclerView mRecyclerView; 

     public ViewHolder(View view) { 
      mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view); 
     } 

     public void initViews(LayoutManager lm) { 
      mRecyclerView.setLayoutManager(lm); 
     } 

     public void scrollToPosition(int position) { 
      mRecyclerView.scrollToPosition(position); 
     } 

     public void setAdapter(RecyclerView.Adapter<?> adapter) { 
      mRecyclerView.setAdapter(adapter); 
     } 

     public void smoothScrollToPosition(int position) { 
      mRecyclerView.smoothScrollToPosition(position); 
     } 
    } 

} 

NoteViewHolder: file

public class NoteViewHolder extends RecyclerView.ViewHolder { 

    private TextView textView; 
    private TextView noteData; 
    private ImageView imageView; 

    public NoteViewHolder(View itemView) { 
     super(itemView); 
     textView = (TextView) itemView.findViewById(R.id.sectionname); 
     imageView = (ImageView) itemView.findViewById(R.id.sectionimage); 
     noteData = (TextView) itemView.findViewById(R.id.noteText); 
    } 

    public void bindText(String text){ 
     textView.setText(text); 
    } 

    public void bindImage(Bitmap bitmap){ 
     imageView.setImageBitmap(bitmap); 
    } 

    public void bindNoteData(String data){ 
     noteData.setText(data); 
    } 
} 

XML: activity_group_section.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:padding="5dip" > 

    <FrameLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingLeft="15dp" 
     android:orientation="vertical"> 
     <ImageView 
      android:id="@+id/sectionimage" 
      android:layout_width="140dp" 
      android:layout_height="200dp" 
      android:scaleType="fitXY" 
      android:padding="5dp" 
      android:src="@drawable/sectionbackground" 
      /> 

     <TextView 
      android:id="@+id/sectionname" 
      android:layout_width="90dp" 
      android:layout_height="match_parent" 
      android:text="@string/textView" 
      android:visibility="visible" 
      android:gravity="center" 
      android:layout_gravity="center_horizontal|top" 
      android:maxLines="1" 
      android:ellipsize="end" 
      android:scrollHorizontally="true" 
      android:layout_marginTop="10dp" /> 

     <TextView 
      android:layout_width="97dp" 
      android:layout_height="160dp" 
      android:id="@+id/noteText" 
      android:layout_gravity="center_horizontal|bottom" 
      android:layout_marginBottom="10dp" 
      android:layout_marginTop="30dp" /> 
    </FrameLayout> 
</RelativeLayout> 

SectionFragment:

<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/recycler_view" 
    android:scrollbars="vertical" 
    android:layout_width="match_parent" 
    android:clipToPadding="false" 
    android:layout_height="wrap_content" /> 

classi del modello per la sezione e Note:

public class RestSection { 

    private int msectionid; 

    private String msectionname; 

    private int mxposition; 

    private int myposition; 

    private int msectionwidth; 

    private int msectionheight; 
} 
public class RestNote { 

    private int mnoticesid; 

    private String mnotetext; 

    private String mnotetag; 

    private String mnotecolor; 

    private double mnoteorder; 
} 

Spero che la mia domanda è chiara, se c'è qualcosa di necessario, gentilmente lo lasciate conoscere.

risposta

1

In realtà sei abbastanza vicino alla tua implementazione ma ci sono alcune cose da notare. La griglia di primo livello è configurata per l'utilizzo di ListView/GridView Adapters mentre la griglia di secondo livello è impostata per RecyclerView.Adapters. Tutto questo va bene una volta che sai cosa stai facendo. Tuttavia, consiglierei di utilizzare l'uno o l'altro fino in fondo (preferibilmente RecyclerView.Adapters in quanto questi sono più scalabili). Per semplificare le cose, però, io darò la soluzione utilizzando la configurazione corrente:

di primo livello (BaseAdapter/ListAdapter + GridView)

Si dovrebbe essere di passaggio in tutta la tua data-set di livello superiore adattatore, ad es ArrayList di RestSection invece di ArrayList di HashMap. HashMap potrebbe essere un membro di RestSection se questi dati sono necessari ma sembra che questo possa essere sostituito da una semplice stringa. La struttura dei dati di RestSection dovrebbe anche avere un membro che è una lista di RestNotes. La vista articolo per questo adattatore dovrebbe avere un RecyclerView, che si trova all'interno di NoteFragment nel tuo caso. Ciò sostituirà potenzialmente noteText in activity_group_section.xml. Nel getView() del tuo adattatore, dovresti impostare l'adattatore di questo RecyclerView con le note che appartengono alla sezione. Vedi i seguenti frammenti di codice per i dettagli.

Strutture dati:

public class RestSection { 
    private int msectionid; 
    private String msectionname; 
    private int mxposition; 
    private int myposition; 
    private int msectionwidth; 
    private int msectionheight; 

    private List<RestNote> mnotes; 
} 

public class RestNote { 
    private int mnoticesid; 
    private String mnotetext; 
    private String mnotetag; 
    private String mnotecolor; 
    private double mnoteorder; 
} 

SectionLazyAdapter:

public class SectionLazyAdapter extends BaseAdapter{ 
    private List<RestSection> data; 

    //... 

    public View getView(int position, View convertView, ViewGroup parent) { 
     View vi=convertView; 
     if(convertView==null) 
      vi = inflater.inflate(R.layout.activity_group_section, null); 

     RestSection mySection = data.get(position); 

     TextView sectionName = (TextView)vi.findViewById(R.id.sectionname); // title 
     sectionName.setText(mySection.getSectionName()); 

     NoteFragments noteGridView = (NoteFragments) vi.findViewById(R.id.notegridfragment); 
     noteGridView.setRecyclerViewAdapter(new NoteAdapter(mySection.getNotes())); 
     return vi; 
    } 
} 

activity_group_section.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:padding="5dip" > 

    <FrameLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingLeft="15dp" 
     android:orientation="vertical"> 
     <ImageView 
      android:id="@+id/sectionimage" 
      android:layout_width="140dp" 
      android:layout_height="200dp" 
      android:scaleType="fitXY" 
      android:padding="5dp" 
      android:src="@drawable/sectionbackground" 
      /> 

     <TextView 
      android:id="@+id/sectionname" 
      android:layout_width="90dp" 
      android:layout_height="match_parent" 
      android:text="@string/textView" 
      android:visibility="visible" 
      android:gravity="center" 
      android:layout_gravity="center_horizontal|top" 
      android:maxLines="1" 
      android:ellipsize="end" 
      android:scrollHorizontally="true" 
      android:layout_marginTop="10dp" /> 
     <fragment android:name="com.mypackagename.NoteFragments" 
      android:layout_width="97dp" 
      android:layout_height="160dp" 
      android:id="@+id/notegridfragment" 
      android:layout_gravity="center_horizontal|bottom" 
      android:layout_marginBottom="10dp" 
      android:layout_marginTop="30dp" /> 
    </FrameLayout> 
</RelativeLayout> 

di 2 ° livello (RecyclerView.Adapter + RecyclerView)

Questo adattatore dovrebbe richiedere un elenco di note come set di dati (come mostrato in SectionLazyAdapter sopra). Utilizzare i dati della nota per popolare l'interfaccia utente come prima. Vedi i frammenti di codice qui sotto.

NoteFragments:

public class NoteFragments extends Fragment { 
    private RecyclerView noteGridView; 
    // ... 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     // as before 
     noteGridView = (RecyclerView) view; 
    } 

    public void setRecyclerViewAdapter(NoteAdapter adapter){ 
     noteGridView.setAdapter(adapter); 
    } 
} 

NoteAdapter:

public class NoteAdapters extends RecyclerView.Adapter<NoteViewHolder> { 
    private List<RestNote> mItems; 

    public NoteAdapters(List<RestNote> notes) { 
     super(); 

     mItems = notes; 
    } 

    @Override 
    public void onBindViewHolder(NoteViewHolder holder, int position) { 
     // populate as before... make sure that RestNote has all of the data required 
    } 
} 

Sarà ovviamente necessario riordinare i dati nel formato richiesto, ma penso che sarà più facile per visualizzare i dati in questo modo.

Spero che questo aiuti.

+0

Lo proverò e ti darò una risposta. Grazie per l'informazione. Si prega di notare che ci vorrà del tempo. –

Problemi correlati