Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Εχω κανει ενα listview και για κάθε γραμή του listview εχω ενα xml το οποιο εχει 2 editText και 2 buttons. Ξερω πως να γεμιζω το listview Το θέμα ειναι το πως θα ξέρω ποιο κουμπι και σε ποια γραμμη πατηθηκε το κουμπι ώστε να μεταβαλω τα editText της αντιστοιχης γραμμης στην οποια πατηθηκε το κουμπι

Δημοσ.

Για δες εδω: http://stackoverflow...t-selected-item

 

 

 

 

 

Το λινκ ειναι ασχετο οσο αναφορα την ερωτηση...

 

 

 

Το είχα δει αυτό αλλά δεν μπορώ να το κάνω να δουλέψει. Δεν καταλαβαίνει ότι πατάω κάπου δλδ σε κάποιο στοιχεία του listview

Δημοσ.

Το πρόβλημα είναι πονηρό, αν κατάλαβα τι θέλεις να κάνεις.. βάλε έναν κωδικό ξεχωριστό για κάθε πλήκτρο μέσο των Tag functions που προσφέρουν όλα τα View και ύστερα στο Click Event σου ξεχώρισε ποίο πλήκτρο πάτησε ο χρήστης με βάση το περιεχόμενο αυτό.

Δημοσ.

Ναι κάτι τέτοιο μάλλον θα βοηθούσε. Απλά λογικά θα πρέπει να βάλω και tags στα EditText ώστε να μπορώ να αλλάζω το editText που θέλω σωστα? Επίσης τα tags θα μπαίνουν πριν προστεθεί η κάθε γραμμη στο listview σωστα?

Δημοσ.
Ναι κάτι τέτοιο μάλλον θα βοηθούσε. Απλά λογικά θα πρέπει να βάλω και tags στα EditText ώστε να μπορώ να αλλάζω το editText που θέλω σωστα? Επίσης τα tags θα μπαίνουν πριν προστεθεί η κάθε γραμμη στο listview σωστα?

Ναι, η φιλοσοφία είναι να πακετάρουμε στο Tag των control μας όσες πληροφορίες μας είναι χρήσιμες ώστε να εντοπίζουμε όσο το δυνατόν πιο εύκολα (μέσο των κατάλληλων Event Handlers / Listeners) και σίγουρα σε ποία θέση εντός των εσωτερικών μας δομών δεδομένων αναφέρεται κάθε στιγμή το control, ανεξαρτήτως της θέσεως του στο ListView μας.

 

Τα tags ορίζονται κατά το .getView του BaseAdapter που χρησιμοποιούμε και συσχετίζονται (λογικά) με το προβαλλόμενο position των δεδομένων που παρουσιάζουμε.

Δημοσ.

Thanks DirextX αλλά εχω μπερδευτει λίγο.

 

Μηπως μπορεις να δωσεις ενα παραδειγμα το πως μπορουμε να βαλουμε tag στα αντικειμενα της κάθε γραμμης του listview?

 

Μπερδευομαι αρχικα στο getView Που λες

πχ εχω αυτον τον κωδικα

 

String[] from = new String[] {"itemName", "itemNumber"};

int[] to = new int[] { R.id.etCartRowItemName, R.id.etCartRowItemNumber };

 

List<HashMap<String, String>> fillMaps = new ArrayList<HashMap<String, String>>();

 

 

HashMap<String, String> map = new HashMap<String, String>();

map.put("itemName", "item1");

map.put("itemNumber", "10");

fillMaps.add(map);

map.put("itemName", "item1");

map.put("itemNumber", "10");

 

 

fillMaps.add(map);

 

adapter = new SimpleAdapter(this, fillMaps, R.layout.cart_item_grid, from, to);

cartList.setAdapter(adapter);

 

και εκτος απο το itemname και Itemnymber εχω και 2 κουμπια σε καθε γραμμη ωστε να αυξανω/μειωνω το itemnumber

 

που θα πρεπει να μπουν τα tags?

Δημοσ.

Ετσι οπως το βλεπω, πρεπει να κανεις εναν δικο σου Adapter, πχ

>public class MyTagAdapter extends SimpleAdapter

ωστε να κανεις Override τις μεθοδους που μπαινουν τα στοιχεια στο ListView και να τα βαζεις tag

Δημοσ.

Thanks DirextX αλλά εχω μπερδευτει λίγο.

 

Μηπως μπορεις να δωσεις ενα παραδειγμα το πως μπορουμε να βαλουμε tag στα αντικειμενα της κάθε γραμμης του listview?

 

Μπερδευομαι αρχικα στο getView Που λες

πχ εχω αυτον τον κωδικα

 

String[] from = new String[] {"itemName", "itemNumber"};

int[] to = new int[] { R.id.etCartRowItemName, R.id.etCartRowItemNumber };

 

List<HashMap<String, String>> fillMaps = new ArrayList<HashMap<String, String>>();

 

 

HashMap<String, String> map = new HashMap<String, String>();

map.put("itemName", "item1");

map.put("itemNumber", "10");

fillMaps.add(map);

map.put("itemName", "item1");

map.put("itemNumber", "10");

 

 

fillMaps.add(map);

 

adapter = new SimpleAdapter(this, fillMaps, R.layout.cart_item_grid, from, to);

cartList.setAdapter(adapter);

 

και εκτος απο το itemname και Itemnymber εχω και 2 κουμπια σε καθε γραμμη ωστε να αυξανω/μειωνω το itemnumber

 

που θα πρεπει να μπουν τα tags?

 

Ακολουθεί ένα μικρό πρόγραμμα που παρουσιάζει έναν τρόπο επίλυσης του προβλήματος με την χρήση του Tag που προσφέρουν τα View του Android.

 

Το πρόγραμμα έρχεται σε 2 τμήματα, το πρώτο είναι ο κώδικας για το Activity και το δεύτερο ο κώδικας για το BaseAdapter που αναλαμβάνει την παρουσίαση και την διαχείρηση των περιεχομένων του ListView.

 

Ο κώδικας για την κατασκευή του UI (2 επιπλέον αρχεία) παραλείπεται καθώς τον θεωρώ τετριμμένο.

 

>
import java.util.HashMap;
import java.util.Vector;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;

public class ListviewbuttonsActivity extends Activity {

   Vector<HashMap<String, String>> HashList;

   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);                             

       // Create a dummy HashList with 20 bogus data
       HashList = new Vector<HashMap<String, String>>();

       for(int Item = 0; Item < 20; Item++)
       {
           HashMap<String, String> HashData = new HashMap<String, String>();
           HashData.put("itemName", String.format("item%d", Item));
           HashData.put("itemNumber", "0");

           HashList.add(HashData);
       }

       // Attach MyListView to "R.id.listView1" UI element and then 
       //  set MyListView adapter to my custom one "CMyListAdapter".
       ListView MyListView = (ListView)findViewById(R.id.listView1);
       MyListView.setAdapter(new CMyListAdapter(this, MyListView, HashList));
       // Force MyListView to update..
       MyListView.invalidateViews();
   }
}

 

>
/*
* Customized BaseAdapter for a Vector<HashMap<String, String>> container.
*/
import java.util.HashMap;
import java.util.Vector;

import android.content.Context;
import android.view.View;
import android.view.View.onclickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

public class CMyListAdapter extends BaseAdapter {

   private Vector<HashMap<String, String>> HashList;        
   private Context AppCon;
   private ListView Owner;

   public CMyListAdapter(Context AppCon, ListView Owner, 
           Vector<HashMap<String, String>> HashList)
   {
       this.AppCon = AppCon;
       this.Owner = Owner;
       this.HashList = HashList;
   }

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

   @Override
   public Object getItem(int arg0) {
       return HashList.get(arg0);
   }

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

   // Our custom getView, it's very lean, no view cache etc.
   //  Not for serious use.
   @Override
   public View getView(int position, View convertView, ViewGroup parent) {

       HashMap<String, String> DataHash = HashList.get(position);

       View ItemView = null;
       Button ItemAddButton = null,
              ItemDecButton = null;
       EditText ItemNameTextBox = null,
                ItemValTextBox  = null;

       if(convertView == null)
           ItemView = View.inflate(AppCon, R.layout.listitems, null);
       else
           ItemView = convertView;

       // - button
       ItemAddButton = (Button)ItemView.findViewById(R.id.button1);
       ItemAddButton.setonclickListener(new onclickListener() {

           @Override
           public void onclick(View v) {                
               final int ItemPos = (Integer)v.getTag();

               HashMap<String, String> HashItem = HashList.get(ItemPos);
               HashItem.put("itemNumber", 
                       Integer.toString(Integer.valueOf(HashItem.get("itemNumber")) - 1));
               Owner.invalidateViews(); // !!
           }
       });
       ItemAddButton.setTag(position);

       // + button
       ItemDecButton = (Button)ItemView.findViewById(R.id.Button2);
       ItemDecButton.setonclickListener(new onclickListener() {

           @Override
           public void onclick(View v) {
               final int ItemPos = (Integer)v.getTag();

               HashMap<String, String> HashItem = HashList.get(ItemPos);
               HashItem.put("itemNumber", 
                       Integer.toString(Integer.valueOf(HashItem.get("itemNumber")) + 1));
               Owner.invalidateViews(); // !!
           }
       });
       ItemDecButton.setTag(position);

       ItemNameTextBox = (EditText)ItemView.findViewById(R.id.editText1);
       ItemNameTextBox.setText(DataHash.get("itemName"));

       ItemValTextBox = (EditText)ItemView.findViewById(R.id.editText2);
       ItemValTextBox.setText(DataHash.get("itemNumber"));        

       return ItemView;
   }

}

 

Εδώ θέλει προσοχή το γεγονός ότι δεν αποθηκεύω σε προσωρινή μνήμη όλα τα View κάθε Item αλλά τα ζητώ μέσο .FindViewById κάθε φορά που χρειάζεται - τούτο πλήττει την ταχύτητα αλλά κρατά τον κώδικα καθαρό για να πάρεις μια ιδέα του πως μπορεί να γίνει.

 

Επίσης δεν λαμβάνω υπόψη μου τι θα γίνει αν ο χρήστης δοκιμάσει να αλλάξει κατευθείαν το περιεχόμενο του EditText και άλλα πιθανά σενάρια χρήσης.

 

Τέλος, δεν είσαι υποχρεωμένος να βασιστείς στον BaseAdapter.

 

Αν όλα πάνε καλά θα έχεις ένα πρόγραμμα του στυλ:

 

 

 

Καλή συνέχεια & καλούς πειραματισμούς.

 

Υ.Γ.

Φυσικά μπορεί να υπάρχουν bugs ή άλλες αβλεψίες (το πρόγραμμα δοκιμάστηκε σε Android 2.2), διαθέτω ελάχιστο χρόνο αυτή την στιγμή και στο Android τα πράγματα θέλουν (πάντα) προσήλωση & προσοχή.

Δημοσ.

Thanks DirectX. Θα δοκιμασω και το δικο σου . Toυ warlock παντως δουλευει.

 

Αλλά πως θα γίνει να κρατάω τα στοιχεία που υπάρχουν μεσα στο listview οταν ανοιγει ενα νεο activity και μετα επιστρεφω παλι στο activity με το καλάθι?

Δημοσ.

Οκ βρήκα πως θα γίνει αυτό. Θα τα κραταω προσωρινά σε έναν πινακα στη βάση που θα εχω ωστε να μην υπαρχει περιπτωση να χαθουν.

 

ΠΩς μπορώ να ξέρω τον αριθμο της γραμμης του listview στην οποια γραμμή βρίσκομαι κάθε φορα?

Αυτό που θέλω είναι να μπορώ να διαβάσω όλα τα δεδομένα του listview ανα γραμμή

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...