Список не заполнен правильно из базы данных с повторяющимися строками

я использую AsyncTask заселять Listview из базы данных mysql через массив JSON. Дело в том, что отображаются все мои элементы, за исключением того, что в списке в последних строках есть повторяющиеся записи.

мой файл из базы данных, как я экспортирую их в порядке возрастания

Проверьте это лучше объяснить, что происходит

И мой код:

public class JsonReadTask extends AsyncTask<String , Void, List<ProductList>> {
public JsonReadTask() {
super();
}

@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(getActivity(), ProgressDialog.THEME_DEVICE_DEFAULT_DARK);
pDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pDialog.setMessage(getString(R.string.get_stocks));
pDialog.setIndeterminate(true);
pDialog.setCancelable(false);
pDialog.setInverseBackgroundForced(true);
pDialog.show();
}

@Override
protected List<ProductList> doInBackground(String... params) {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(params[0]);
try {
HttpResponse response = httpclient.execute(httppost);
jsonResult = inputStreamToString(
response.getEntity().getContent()).toString();
customList = new ArrayList<>();

JSONObject jsonResponse = new JSONObject(jsonResult);
//JSONArray jsonMainNode = jsonResponse.optJSONArray("beverages");
JSONArray array = jsonResponse.getJSONArray("beverages");
for (int i = 0; i < array.length(); i++) {
JSONObject jsonChildNode = array.getJSONObject(i);
String name = jsonChildNode.getString("name");
String price = jsonChildNode.getString("price");
String image = jsonChildNode.getString("image");
customList.add(new ProductList(image, name, price));

}
return customList;
} catch (Exception e) {
e.printStackTrace();
getActivity().finish();
}
return null;
}

private StringBuilder inputStreamToString(InputStream is) {
String rLine = "";
StringBuilder answer = new StringBuilder();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
try {
while ((rLine = rd.readLine()) != null) {
answer.append(rLine);
}
} catch (Exception e) {
getActivity().finish();
}
return answer;
}

@Override
protected void onPostExecute(List<ProductList> customList) {
if(customList == null){
Log.d("ERORR", "No result to show.");
return;
}
ListDrawer(customList);
pDialog.dismiss();
}
}// end async task

public void accessWebService() {
JsonReadTask task = new JsonReadTask();
task.execute(new String[]{url});
}

public void ListDrawer(List<ProductList> customList) {
adapter = new ProductListAdapter(getActivity().getApplicationContext(), R.layout.list_item, customList);
adapter.notifyDataSetChanged();
lv.setAdapter(adapter);
}

Мой код адаптера, хотя я думаю, что не имеет значения, потому что он отлично работает на кофе и закуски:

public class ProductListAdapter extends ArrayAdapter<ProductList> {

public ProductListAdapter(Context context, int layoutId, List<ProductList> items) {
super(context, layoutId, items);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View arrayView = convertView;
ViewHolderItems holder;
ProductList currentPosition = null;

if(arrayView == null){
LayoutInflater vi;
vi = LayoutInflater.from(getContext());
arrayView = vi.inflate(R.layout.list_item, parent, false);
currentPosition = getItem(position);
holder = new ViewHolderItems();
holder.viewName = (TextView)arrayView.findViewById(R.id.product_name_coffee);
holder.viewPrice = (TextView)arrayView.findViewById(R.id.product_price_coffee);
holder.viewImage = (ImageView)arrayView.findViewById(R.id.product_image_coffee);
arrayView.setTag(holder);
}else{
holder = (ViewHolderItems) arrayView.getTag();
}
if(currentPosition != null){
holder.viewName.setText(currentPosition.getName());
holder.viewPrice.setText(currentPosition.getPrice());
Ion.with(holder.viewImage).placeholder(R.drawable.ic_launcher).error(R.drawable.ic_launcher).load(currentPosition.getImage());
}
return arrayView;
}

static class ViewHolderItems {
TextView viewName, viewPrice;
ImageView viewImage;
}}

Мой php код:

<?php
try {
$handler = new PDO('mysql:host=localhost;dbname=database', 'root', 'password');
$handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (Exception $e) {
echo $e->getMessage();
die();
}

$query = $handler->query('SELECT * FROM beverages ORDER BY `name` ASC');
$records = array();
$records = $query->fetchAll(PDO::FETCH_ASSOC);
$json['beverages'] = $records;
echo json_encode($json);

Есть идеи, почему это происходит ???

0

Решение

Похоже, проблема в вашем методе getView (), а именно в следующем фрагменте кода:

    if(currentPosition != null){
holder.viewName.setText(currentPosition.getName());
holder.viewPrice.setText(currentPosition.getPrice());
Ion.with(holder.viewImage).placeholder(R.drawable.ic_launcher).error(R.drawable.ic_launcher).load(currentPosition.getImage());
}

Строка представления будет обновлена ​​только в том случае, если currentPosition не является нулевым — что происходит только если convertView является null, И если данные строки не будут обновлены, он будет просто использовать то, что в настоящее время находится в convertView. Вот почему некоторые данные будут выглядеть дублированными.

Чтобы исправить это, просто вы можете просто удалить упаковку if и оставьте три строки в нем нетронутыми.

0

Другие решения

Попробуйте инициализировать адаптер в onCreate ()

List<ProductList> list;

@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
adapter = new ProductListAdapter(getActivity().getApplicationContext(), R.layout.list_item, list);
}

Обновление переменной, используемой для вызова конструктора адаптера массива (в этом случае я объявил другую глобальную переменную List list и передал эту переменную в конструктор адаптера массива)

public void ListDrawer(List<ProductList> customList) {
list = customList;
adapter.notifyDataSetChanged();
lv.setAdapter(adapter);
}
0

Я думаю, что проблема в getView метод вашего списка просмотра адаптера. Я бы изменил это так:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolderItems holder;

if (convertView == null) {
LayoutInflater layoutInflater = (LayoutInflater) getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

convertView = layoutInflater.inflate(R.layout.list_item, parent, false);

holder = new ViewHolderItems();
holder.viewName = (TextView)convertView.findViewById(R.id.product_name_coffee);
holder.viewPrice = (TextView)convertView.findViewById(R.id.product_price_coffee);
holder.viewImage = (ImageView)convertView.findViewById(R.id.product_image_coffee);
convertView.setTag(holder);

} else {
holder = (ViewHolderItems) convertView.getTag();
}holder.viewName.setText(getItem(position).getName());
holder.viewPrice.setText(getItem(position).getPrice());
Ion.with(holder.viewImage).placeholder(R.drawable.ic_launcher).error(R.drawable.ic_launcher).load(getItem(position).getImage());return convertView;
}
0
По вопросам рекламы [email protected]