从数据库获取数据并显示到ListView时重复的值

时间:2016-03-18 08:40:39

标签: java android listview android-arrayadapter

我是Android Developement的新用户,目前正致力于开发一款应用程序,该应用程序可让我在第一次点击按钮和第二次点击按钮之间的时间,并将其添加到当前选定的客户。

App的当前状态: 我使用Volley和本地Web服务建立了与da mySql数据库的连接。

它可以将我的客户和时间戳插入到表格中,但是当为特定客户加载时间时,我会在一个案例中得到奇怪的结果。我试过调试它但是应用程序在没有消息的情况下继续崩溃。如果不进行调试,它不会崩溃但会显示奇怪的数据。

解决问题:

在我名为“ZeitErfassen”的主要活动中,我有一个按钮,可以了解ListView中显示的所有客户的概况。 我使用自定义ArrayAdapter创建Listview,因为我想将我的对象传递给下一个显示客户的Activity。

所以onCreate的客户概述我创建了一个新的arraylist并填充了我的数据库中的所有客户。我将这个列表传递给我的customadapter,然后将其设置为Listview的适配器。 现在,当我点击一个项目时,我调用一个php脚本并将customer_id传递给查询,以便从customer_id = customer_id的数据库中获取所有时间。

现在我得到“奇怪”数据的部分......

1.(来源:ZeitErfassen;目的地:AddCustomer)我在应用程序中创建了一个新客户,例如xyz,数据被传递到数据库。

2.(来源:ZeitErfassen;目的地:DisplayCustomer)我为ListView充满数据的所有客户打电话给我的概述,如上所述。在列表的最后,我看到了我刚创建的客户,xyz。

3.返回主要活动(ZeitErfassen)

4.(来源:ZeitErfassen;目的地:DisplayCustomer)我再次打开所有客户的概述,它显示我上次创建的用户两次!最后一个条目,xyz,最后一个条目,xyz!

之后,我可以根据需要多次打开视图,客户永远不会再次重复!

调试器在第2步之后停止。

现在,当我点击新客户时,它会调用脚本来获取customer_id的时间。 其中一个xyz entrys从数据库中显示正确的时间。 第二个,我刚刚发现,显示customer_id =“”的时间。在数据库中,“”的值为0。

我不知道第二个客户突然出现在哪里,调试也没有帮助我-.- 当我关闭应用程序并再次打开它时,在关闭应用程序之前,只有一个条目可供用户显示两次。它在打开视图时没有重复...

这是我的代码..

主要活动ZeitErfassen

public class ZeitErfassen extends AppCompatActivity {

public static LinkedList<Kunde> kunden = new LinkedList<Kunde>();
boolean running = false;
long startTime,endTime,totalTime;

private SharedPreferences app_preferences;
private SharedPreferences.Editor editor;
private TextView displayTime;
public Button startEndButton;
private ArrayAdapter<String> adapter;
private Spinner spinner;
public static Kunde selectedCustomer;




@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_zeit_erfassen);
    //Einstellungen laden
    app_preferences =  getApplicationContext().getSharedPreferences("MyPref", MODE_PRIVATE);
    startTime= app_preferences.getLong("startTime", 0);
    endTime = app_preferences.getLong("endTime", 0);
    running = app_preferences.getBoolean("running", false);
    displayTime = (TextView)findViewById(R.id.zeit_bei_Kunde);
    displayTime.setText((CharSequence) app_preferences.getString("zeitAnzeige", "Zeit bei Kunde"));
    startEndButton = (Button)findViewById(R.id.start_Timer);
    startEndButton.setText((CharSequence) app_preferences.getString("timerButton", "Start Timer"));
    DatabaseHelper.customerFromDatabaseToList(this);
    editor = app_preferences.edit();
    editor.commit();
}

public void onDestroy() {
    super.onDestroy();

    editor.putLong("startTime", startTime);
    editor.putString("zeitAnzeige", (String) displayTime.getText());
    editor.putString("timerButton", (String) startEndButton.getText());
    editor.putLong("endTime", endTime);
    editor.putLong("totalTime", totalTime);
    editor.putBoolean("running", app_preferences.getBoolean("running", false));
    editor.commit();
    this.finish();
}

public void onResume() {
    super.onResume();
 //   saveCustomers();
 //   createDropDown();
}


public void startTimer(View view) {
    editor = app_preferences.edit();

    if(running == false) {
        startTime = getTime();
        running = true;
        editor.putLong("startTime", startTime);
        startEndButton.setText("End Timer");
        displayTime.setText("Zeitstoppung läuft");
        editor.putString("zeitAnzeige", (String) displayTime.getText());
        editor.putString("timerButton", (String) startEndButton.getText());
        editor.putBoolean("running", true);
        editor.commit();

    } else {
        setSelectedCustomer();
        endTime = getTime();
        editor.putLong("endTime",endTime);
        totalTime = endTime - startTime;
        editor.putLong("totalTime", totalTime);
        displayTime.setText(formatTime(totalTime));
        editor.putString("zeitAnzeige", (String) displayTime.getText());
        startEndButton.setText("Start Timer");
        editor.putString("timerButton", (String) startEndButton.getText());
        running = false;
        editor.putBoolean("running", false);
        editor.commit();
        DatabaseHelper.timeToDatabase(String.valueOf(selectedCustomer.getId()),formatTime(totalTime),this);
    //    selectedCustomer.saveTimeToCustomer(selectedCustomer, formatTimeForCustomer(totalTime));

    }
}

public String formatTime(Long totalTime) {
    int hours   = (int) ((totalTime / (1000*60*60)) % 24);
    int minutes = (int) ((totalTime / (1000*60)) % 60);
    int seconds = (int) (totalTime / 1000) % 60;

    String time = (String.valueOf(hours) + ":" + String.valueOf(minutes) + ":" + String.valueOf(seconds));
    return time;
}
public String formatTimeForCustomer(Long totalTime) {
    StringBuilder time = new StringBuilder();

    Calendar cal = Calendar.getInstance();
    int year    = cal.get(Calendar.YEAR);
    int month   = cal.get(Calendar.MONTH);
    int day     = cal.get(Calendar.DAY_OF_MONTH);
    time.append((String.valueOf(year) + "." + String.valueOf(month) + "." + String.valueOf(day))).append(formatTime(totalTime));
    return time.toString();
}

public void  neuerKunde(View view) {
    Intent intent = new Intent(this, AddKunde.class);
    startActivity(intent);
}
public void kundenÜbersicht(View view) {
//    setSelectedCustomer();
    Intent intent = new Intent(this, DisplayCustomer.class);
    startActivity(intent);
}

public long getTime() {
    long millis = System.currentTimeMillis();
    return millis;
}

public void setSelectedCustomer() {
    if(kunden.size() > 0) {
        if (spinner.getSelectedItem().toString() != null) {
            String tempCustomer = spinner.getSelectedItem().toString();
            for (Kunde k : kunden) {
                if (k.getName().equals(tempCustomer)) {
                    selectedCustomer = k;
                }
            }
        }
    }
}


public void createDropDown() {
    /*File file = new File(this.getFilesDir(),"kunden.ser"); NOT USED BECAUSE DATABASE WORKS
    if(file.exists()) {
        Kunde.importFromFile(this);
    }*/
        if (kunden.size() > 0) {
            spinner = (Spinner) findViewById(R.id.chooseCustomer);
            // Create an ArrayAdapter using the string array and a default spinner layout
            adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, DisplayCustomer.namesOfCustomers());

            // Specify the layout to use when the list of choices appears
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            // Apply the adapter to the spinner
            spinner.setAdapter(adapter);
        }
}

}

DisplayCustomer(所有客户都显示数据库中的数据)

public class DisplayCustomer extends AppCompatActivity {
CustomerAdapter customerAdapter;
public ArrayAdapter<String> adapterCustomerView;
private ListView listCustomerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_display_customer);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    ArrayList<Kunde> customerList = getCustomerObjects();
    customerAdapter = new CustomerAdapter(this,customerList);
    listCustomerView = (ListView)findViewById(R.id.list_View_Customers);
    //  adapterCustomerView = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, namesOfCustomers());
    listCustomerView.setAdapter(customerAdapter);
    openCustomerDetails();
}


public static ArrayList<String> namesOfCustomers() {
    ArrayList<String> customerNames = new ArrayList<>();
    if(ZeitErfassen.kunden.size() > 0 ) {
        for (Kunde k : ZeitErfassen.kunden) {
            customerNames.add(k.getName());
        }
    }
    return customerNames;
}


public static ArrayList<Kunde> getCustomerObjects() {
    ArrayList<Kunde> customerList = new ArrayList<>();
    if(ZeitErfassen.kunden.size() > 0 ) {
        for (Kunde k : ZeitErfassen.kunden) {
            customerList.add(k);
        }
    }
    return customerList;
}


public void openCustomerDetails() {
    listCustomerView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Kunde kunde = new Kunde();
            kunde = (Kunde)listCustomerView.getItemAtPosition(position);
            Intent intent = new Intent(DisplayCustomer.this, DisplayDetailedCustomer.class);
            intent.putExtra("selectedCustomerObject",(Parcelable)kunde);
            startActivity(intent);
        }
    });
}

}

我的CustomerAdapter将数据从一个意图传递到另一个意图。

public class CustomerAdapter extends ArrayAdapter<Kunde> {
public CustomerAdapter(Context context, ArrayList<Kunde> customerList) {
    super(context,0,customerList);
}

public View getView(int position, View convertView, ViewGroup parent) {
    //Data for this position
    Kunde kunde = getItem(position);
    if (convertView == null) {
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.items_customer_layout, parent, false);
    }
    // Lookup view for data population
    TextView tvName = (TextView) convertView.findViewById(R.id.tvCustomerName);
    // Populate the data into the template view using the data object
    tvName.setText(kunde.getName());

    // Return the completed view to render on screen
    return convertView;
}

}

DatabaseHelper Class

public class DatabaseHelper {
public static RequestQueue requestQueue;
public static String host = "http://192.168.150.238/";
public static final String insertUrl = host+"insertCustomer.php";
public static final String showUrl = host+"showCustomer.php";
public static final String insertTimeUrl = host+"insertTime.php";
public static final String showTimeUrl = host+"showTimes.php";

public static void customerFromDatabaseToList(final Context context)  {
    //Display customer from database
    requestQueue = Volley.newRequestQueue(context);
    final ArrayList<String> customerNames = new ArrayList<>();
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, showUrl, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            try {
                JSONArray customers = response.getJSONArray("customers");
                if(customers.length() > 0) {
                    for (int i = 0; i < customers.length(); i++) {
                        JSONObject customer = customers.getJSONObject(i);
                        String customerName = customer.getString("cus_name");
                        String customerAddress = customer.getString("cus_address");
                        int customerID = Integer.valueOf(customer.getString("cus_id"));
                        if (customerName != null && customerAddress != null) {
                            try {
                                Kunde k = new Kunde(customerName, customerAddress, customerID);
                                if (!listContainsObject(k)) {
                                    ZeitErfassen.kunden.add(k);
                                }
                            } catch (Exception e) {
                                showAlert("Fehler in customerFromDatabaseToListn!", "Fehler", context);
                            }
                        } else {
                            showAlert("Fehler in customerFromDatabaseToListn!", "Fehler", context);
                        }
                    }
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    });
    requestQueue.add(jsonObjectRequest);
}

public static boolean listContainsObject(Kunde cust) {
    for(Kunde k : ZeitErfassen.kunden) {
        if(k.getId() == cust.getId()) {
            return true;
        }
    }
    return false;
}

public static void timeToDatabase(final String customer_id, final String time_value, final Context context) {
    requestQueue = Volley.newRequestQueue(context);
    StringRequest request = new StringRequest(Request.Method.POST, DatabaseHelper.insertTimeUrl, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            showAlert("Fehler","Fehler bei Verbindung zur Datenbank",context);
        }
    }) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String,String> parameters = new HashMap<String,String>();
            parameters.put("customerid",customer_id);
            parameters.put("timevalue",time_value);
            return parameters;
        }
    };
    requestQueue.add(request);
};



public static void showAlert(String title, String message, Context context) {
    // 1. Instantiate an AlertDialog.Builder with its constructor
    AlertDialog.Builder builder = new AlertDialog.Builder(context);

    // 2. Chain together various setter methods to set the dialog characteristics
    builder.setMessage(message)
            .setTitle(title);

    // 3. Get the AlertDialog from create()
    AlertDialog dialog = builder.create();
}


public static ArrayList<String> timesFromDataBaseToList(final Context context,final int customer_id) {
    requestQueue = Volley.newRequestQueue(context);
    final String cus_id = String.valueOf(customer_id) ;
    final ArrayList<String> customerTimes = new ArrayList<>();

    StringRequest jsonObjectRequest = new StringRequest(Request.Method.POST, showTimeUrl, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            try {
                JSONObject object = new JSONObject(response.toString());
                JSONArray times = object.getJSONArray("customertimes");
                if (times.length() > 0) {
                    for (int i = 0; i < times.length(); i++) {
                        JSONObject jsonObject = times.getJSONObject(i);
                        String timeValue = jsonObject.getString("time_value");
                        if (timeValue != null) {
                            customerTimes.add(timeValue);
                        }
                    }
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(context,"Fehler beim Holen der Zeiten",Toast.LENGTH_LONG).show();
                error.printStackTrace();
            }
    }){
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String,String> parameters = new HashMap<String,String>();
            parameters.put("cus_id",cus_id);
            return parameters;
        }
    };
    requestQueue.add(jsonObjectRequest);
    return customerTimes;
};

}

DisplayDetailedCustomer /显示时间

public class DisplayDetailedCustomer extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_display_detailed_customer);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);


    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    Intent getCustomerParcable = getIntent();
    Kunde customer = getCustomerParcable.getExtras().getParcelable("selectedCustomerObject");

    TextView displayCustomerNameDetailed =(TextView) findViewById(R.id.detailedCustomerViewName);
    TextView displayCustomerAddressDetailed =(TextView) findViewById(R.id.detailedCustomerAddress);
    ListView timeListView = (ListView)findViewById(R.id.detailedTimeListView);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, DatabaseHelper.timesFromDataBaseToList(this,customer.getId()));
    timeListView.setAdapter(adapter);
    displayCustomerNameDetailed.setText(customer.getName());
    displayCustomerAddressDetailed.setText(customer.getAdresse());
}

}

带有Parcelable接口的Kunde Class / Customer Class

public class Kunde implements Serializable,Parcelable {
private String name;
private String adresse;
private int id;
public LinkedList<String> zeiten;

public Kunde(String name, String adresse) throws Exception{
    setName(name);
    setAdresse(adresse);
    zeiten = new LinkedList<String>();
}

public Kunde(String name, String adresse,int id) throws Exception{
    setName(name);
    setAdresse(adresse);
    setId(id);
    zeiten = new LinkedList<String>();
}
public Kunde(){};


public void setId(int id) {
    this.id = id;
}
public int getId(){
    return id;
}
public void setName(String name) throws Exception {
    if(name != null) {
        this.name = name;
    } else throw new Exception("Name ist ungueltig! in setName");
}

public void setAdresse(String adresse) throws Exception{
    if(adresse != null) {
        this.adresse = adresse;
    }else throw new Exception("Adresse ist ungueltig! in setAdresse");
}

public String getName() {
    return name;
}

public String getAdresse() {
    return adresse;
}


public void saveZeit(Long totalTime) {
    zeiten.add(String.valueOf(totalTime));
}


public void saveTimeToCustomer(Kunde customer,String time){
   customer.zeiten.add(time);
}

//------------------------------------Parcelable Methods to pass Daata from one Intent to another----------------------------------------
@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(this.id);
    dest.writeString(this.name);
    dest.writeString(this.adresse);
//    dest.writeList(this.zeiten);
}
// this is used to regenerate your object. All Parcelables must have a CREATOR that implements these two methods
public static final Parcelable.Creator<Kunde> CREATOR = new Parcelable.Creator<Kunde>() {
    public Kunde createFromParcel(Parcel in) {
        return new Kunde(in);
    }

    public Kunde[] newArray(int size) {
        return new Kunde[size];
    }
};

// example constructor that takes a Parcel and gives you an object populated with it's values
private Kunde(Parcel in) {
    LinkedList<String> zeiten = null;
    id = in.readInt();
    name = in.readString();
    adresse = in.readString();
}

}

感谢您抽出宝贵的时间!!

0 个答案:

没有答案