2016-06-29 31 views
0

Ich habe zwei Klassen, eine Personenklasse, die eine neue Instanz einer Person erstellt, und eine Stoppuhrklasse, die eine neue Instanz einer Stoppuhr erstellt (die Variablen Button, Button, TextView) und Person).Kann keine neue Klasseninstanz für BaseAdapter erstellen

in meiner Hauptfunktion habe ich zwei Textfelder bearbeiten, eine Schaltfläche und dann eine Listenansicht. Was ich versuche zu tun, ist EditText mit Vorname und Nachname zu füllen, dann klicken Sie auf Speichern. Nach dem Speichern möchte ich diese Daten in dieser bestimmten Instanz meiner Person speichern. Verwenden Sie dann diese Person, um den Text des Buttons innerhalb der Stoppuhr-Instanz zu aktualisieren. Jeder Stoppuhrinstanz sollte eine andere Personeninstanz zugewiesen sein, so dass jede Stoppuhr einen anderen Namen hat. Momentan tut mein onclick Listener für den Speicherknopf nichts und ich weiß nicht warum. Im Moment habe ich den getCount fest programmiert, bis ich nur noch eine Person einer Stoppuhr zuordnen kann.

Sorry, wenn dies eine dumme Frage ist, ich bin neu in Java

Hauptfunktion:

import android.annotation.SuppressLint; 
import android.content.Context; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity { 

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

    final EditText firstName = (EditText)findViewById(R.id.FirstName); 
    final EditText lastName = (EditText)findViewById(R.id.LastName); 
    ListView listView = (ListView)findViewById(R.id.listView); 
    final Button save = (Button)findViewById(R.id.SaveUser); 


    BaseAdapter myAdapter = new BaseAdapter() { 
     @Override 
     public int getCount() { 
      return 1; 
     } 

     @Override 
     public Object getItem(int position) { 
      return null; 
     } 

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

     @SuppressLint("ViewHolder") 
     @Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 
      LayoutInflater inflater = (LayoutInflater) getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.stopwatchview,parent,false); 

      final TextView Screen = (TextView) convertView.findViewById(R.id.Clock_View); 
      final Button start = (Button) convertView.findViewById(R.id.button_start); 
      Button reset = (Button) convertView.findViewById(R.id.button_reset); 
      final Person person = new Person(); 
      final Stopwatch stopwatch = new Stopwatch(Screen,start,reset,person);; 
      Button save = (Button) findViewById(R.id.SaveUser); 
      final EditText first = (EditText) findViewById(R.id.FirstName); 
      final EditText last = (EditText) findViewById(R.id.LastName); 

      assert save != null; 
      save.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        person.setName(first.getText().toString(), last.getText().toString()); 
       } 
      }); 


      start.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if (stopwatch.isTicking()) { 
         stopwatch.stop(); 
        } else { 
         stopwatch.start(); 
        } 
       } 
      }); 

      reset.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        stopwatch.reset(); 
       } 
      }); 
      return convertView; 
     } 
    }; 
    listView.setAdapter(myAdapter); 
} 
} 

Stoppuhr Klasse:

import android.graphics.Color; 
import android.os.Handler; 
import android.os.SystemClock; 
import android.widget.Button; 
import android.widget.TextView; 

public class Stopwatch { 
    TextView text; 
    Button start; 
    Button reset; 
    Person person; 


public Stopwatch(TextView t, Button Start, Button Reset, Person p){ 
    text = t; 
    start = Start; 
    reset = Reset; 
    person = p; 

} 

long starttime = 0L; 
long timeInMilliseconds = 0L; 
long timeSwapBuff = 0L; 
long updatedtime = 0L; 
int t = 1; 
int secs = 0; 
int mins = 0; 
int milliseconds = 0; 
Handler handler = new Handler(); 
Runnable callback; 

public void start(){ 
    callback = updateTimer(); 
    start.setText("pause"); 
    starttime = SystemClock.uptimeMillis(); 
    handler.postDelayed(callback, 0); 
    t = 0; 
} 

public void stop(){ 
    text.setTextColor(Color.BLUE); 
    start.setText(person.firstName); 
    timeSwapBuff += timeInMilliseconds; 
    handler.removeCallbacks(callback); 
    t = 1; 
} 

public void reset(){ 
    stop(); 
    starttime = 0L; 
    timeInMilliseconds = 0L; 
    timeSwapBuff = 0L; 
    updatedtime = 0L; 
    t = 1; 
    secs = 0; 
    mins = 0; 
    milliseconds = 0; 
    if(t==0){ 
     handler.removeCallbacks(callback); 
    } 
    text.setText("00:00:00"); 
} 

public boolean isTicking(){ 
    if(t==0){ 
     return true; 
    } 
    return false; 
} 

//Update Timer 
private Runnable updateTimer() { 
    return new Runnable() { 
     public void run() { 
      timeInMilliseconds = SystemClock.uptimeMillis() - starttime; 
      updatedtime = timeSwapBuff + timeInMilliseconds; 
      secs = (int) (updatedtime/1000); 
      mins = secs/60; 
      secs = secs % 60; 
      milliseconds = (int) (updatedtime % 1000); 
      text.setText("" + mins + ":" + String.format("%02d", secs) + ":" 
        + String.format("%03d", milliseconds)); 
      text.setTextColor(Color.RED); 
      handler.postDelayed(this, 0); 
     } 
    }; 
}; 

} 

Person Klasse:

public class Person { 
String firstName; 
String lastName; 
String initials; 

public Person(){ 
    firstName = null; 
    lastName = null; 
    initials = null; 
}; 

public void setName(String FirstName, String LastName){ 
    firstName = FirstName; 
    lastName = LastName; 
    setInitials(FirstName, LastName); 
} 

private void setInitials(String firstName, String lastName) { 
    String firstLetter = firstName.substring(0,1); 
    String lastLetter = lastName.substring(0,1); 
    initials = firstLetter.concat(lastLetter); 
} 

} 

Antwort

0

Das Hauptproblem ist, dass Ihr BaseAdapter niemals mit Daten gefüllt wird. Sie greifen also auf leere Daten zu. Dies liegt daran, dass Sie BaseAdapter nicht ordnungsgemäß verwenden.

Zuerst definieren Sie eine Sammlung von Personendaten.

ArrayList<Person> mPersonList; 

Dann erstellen Sie Ihren Adapter wie dies durch die Erweiterung BaseAdapter: Dies kann unter Verwendung von Array erreicht werden

public class MyBaseAdapter extends BaseAdapter { 

    ArrayList<Person> mPersonList = new ArrayList()<>; 
    LayoutInflater inflater; 
    Context context; 


    public MyBaseAdapter(Context context, ArrayList<Person> myList) { 
     this.myList = myList; 
     this.context = context; 
     inflater = LayoutInflater.from(this.context); 
    } 

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

    @Override 
    public ListData getItem(int position) { 
     return myList.get(position); 
    } 

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     MyViewHolder mViewHolder; 

     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.layout_list_item, parent, false); 
      mViewHolder = new MyViewHolder(convertView); 
      convertView.setTag(mViewHolder); 
     } else { 
      mViewHolder = (MyViewHolder) convertView.getTag(); 
     } 

    // get data in position 
     ListData currentListData = getItem(position); 

    // set data to view 
     mViewHolder.edtFirstName.setText(currentListData.getFirstName()); 
    // add your other data to other view. 

     return convertView; 
    } 

    private class MyViewHolder { 
     EditText edtFirstName; 
    // Add the other view here. 

     public MyViewHolder(View item) { 
      edtFirstName = (EditText) item.findViewById(R.id.FirstName); 
     // add the other view here. 
     } 
    } 
} 

Fix Sie Person-Klasse durch Hinzufügen Setter und Getter von Ihrem erweiterten BaseAdapter verwendet werden:

public class Person { 
    private String firstName; 
    private String lastName; 
    private String initials; 

    public Person(){ 
    this("", ""); 
    }; 

    public Person(String FirstName, String LastName){ 
    firstName = FirstName; 
    lastName = LastName; 
    setInitials(FirstName, LastName); 
    } 

    private void setInitials(String firstName, String lastName) { 
    String firstLetter = firstName.substring(0,1); 
    String lastLetter = lastName.substring(0,1); 
    initials = firstLetter.concat(lastLetter); 
    } 

    private void setFirstName(String firstName) { 
    this.firstName = firstName; 
    } 

    private String firstName() { 
    return this.firstName; 
    } 

    //ADD the other setter and getter like setFirstName and firstName method. 
} 

Populate einige Daten für Person für Ihre BaseAdapter:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    ... 
    ... 
    ArrayList<Person> mPersonList = new ArrayList<Person>(); 
    // this is a simple data 
    Person person1 = new Person("John", "Keley"); 
    Person person2 = new Person("Chris", "Maloy"); 
    Person person3 = new Person("Andery", "Dreyfus"); 
    Person person4 = new Person("Portgas", "D. Ace"); 
    Person person5 = new Person("Bankai", "Zankupatto"); 
    mPersonList.add(person1); 
    mPersonList.add(person2); 
    mPersonList.add(person3); 
    mPersonList.add(person4); 
    mPersonList.add(person5); 
} 

Fügen Sie dann Ihren Adapter hinzu, nachdem Sie Personendaten hinzugefügt haben: // Dies sollte weiter unten, nachdem mPersonList-Daten hinzugefügt wurden. listView.setAdapter (neuer MyBaseAdapter (this, mPersonList));

...

Für eine vollständige Tutorial können Sie sehen: ListView using BaseAdapter - Android