Заполнение списка из онлайн-базы данных

Я новичок в программировании, и я довольно долго пытался сделать эту работу, но мне не удалось ее решить, поэтому я хочу перенести данные (пока только имена) из моей онлайн-базы данных в список и отобразить его. Я уже проверил свой файл php, и он отлично работает (возвращает имена, которые я хочу), также код, похоже, работает нормально, пока я не дойду до части Baseadapter.

Действия VerPosts

import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Rect;
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.ListView;
import android.widget.TextView;
import com.github.snowdream.android.widget.SmartImageView;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import org.json.JSONArray; 
import org.json.JSONException;   
import java.util.ArrayList;  
import cz.msebera.android.httpclient.Header;

public class VerPostsUsuario extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_ver_posts_usuario);
    listView=(ListView)findViewById(R.id.listView);
    descargarImagen();


}

private ListView listView;

ArrayList nombreAnimal = new ArrayList();

private void descargarImagen(){
    nombreAnimal.clear();

    final ProgressDialog progressDialog = new ProgressDialog(VerPostsUsuario.this);
    progressDialog.setMessage("Cargando Datos");
    progressDialog.show();

    AsyncHttpClient client = new AsyncHttpClient();
    client.get("mydomain+php", new AsyncHttpResponseHandler() {
        @Override
        public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
            if (statusCode==200){
                progressDialog.dismiss();
                try {
                    JSONArray jsonArray = new JSONArray(new String(responseBody));
                    for (int i=0; 1<jsonArray.length();i++){
                        nombreAnimal.add(jsonArray.getJSONObject(i).getString("nombreAnimal"));

                    }
                    listView.setAdapter(new ImagenAdapter(getApplicationContext()));

                } catch (JSONException e) {
                    e.printStackTrace();
                }


            }
        }

        @Override
        public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {

        }
    });

}

private class ImagenAdapter extends BaseAdapter {
    Context ctx;
    LayoutInflater layoutInflater;
    TextView tvnombreAnimal;


    public ImagenAdapter(Context applicationContext) {
        this.ctx=applicationContext;
        layoutInflater=(LayoutInflater)ctx.getSystemService(LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return 0;
    }

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

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

    @Override
    public View getView(int i, View convertView, ViewGroup parent) {

        ViewGroup viewGroup =(ViewGroup)layoutInflater.inflate(R.layout.activity_main_items, null);
       tvnombreAnimal = (TextView) viewGroup.findViewById(R.id.tvnombreAnimal1);

        tvnombreAnimal.setText(nombreAnimal.get(i).toString());







        return viewGroup;
    }

Активность VerPostsUsuario XML (ListView)

<ListView
        android:id = "@+id/listView"
        android:layout_width = "368dp"
        android:layout_height = "492dp"
        android:layout_marginBottom = "8dp"
        android:layout_marginEnd = "8dp"
        android:layout_marginLeft = "8dp"
        android:layout_marginRight = "8dp"
        android:layout_marginStart = "8dp"
        android:background = "#11000000"
        app:layout_constraintBottom_toBottomOf = "parent"
        app:layout_constraintEnd_toEndOf = "parent"
        app:layout_constraintStart_toStartOf = "parent" />

Activity_main_items XML

<TextView
        android:id = "@+id/tvnombreAnimal1"
        android:layout_width = "177dp"
        android:layout_height = "39dp"
        android:layout_gravity = "center_horizontal"
        android:layout_marginBottom = "8dp"
        android:layout_marginLeft = "148dp"
        android:layout_marginStart = "148dp"
        android:layout_marginTop = "8dp"
        android:textColor = "#000"
        android:textSize = "24dp"

         />

Первоначально в руководстве также было показано, как отображать изображения (вот почему есть импорт «SmartImageView» и «Rect»), поэтому я удалил эту часть и попытался сделать это только с текстом. Возможно, я где-то напортачил, но не могу найти где, поэтому, если бы вы могли помочь мне в этом, я был бы очень благодарен.

Редактировать:

Поэтому я хочу поблагодарить всех людей, которые пытались мне помочь, похоже, у Array было несколько проблем, как и у Baseadapter. Я перечислю их ниже для всех, у кого есть подобная проблема.

-Множество:

У меня была «1» вместо «i», и пришлось заменить

Я пытался получить поле из базы данных под названием «nombreAnimal», когда на самом деле в моем php-файле я назначил «nombreAnimal» на «Nombre» (nombreAnimal.add (jsonArray.getJSONObject (i) .getString («Nombre»)) ;)

Я также обнаружил, что лучший способ проверить, имеет ли ваш массив нужные вам значения (или, по крайней мере, что-то), - это проверить Logcat Android.

-BaseAdapter:

Я забыл получить размер из моего массива в getCount (Array.size;)

Я забыл в getItem, мне нужно было вернуть «позицию», в моем случае «i», из моего массива «nombreAnimal» (Array.get (i);)

Я забыл в getItemdId вернуть "i" (i;)

Обратите внимание, что в for (int i=0; 1<jsonArray.length();i++){ есть небольшая ошибка, это должно быть i<jsonArray.length(). Надеюсь, это поможет!

i_A_mok 02.09.2018 04:46

Спасибо, я не заметил, это не работает, но это шаг в правильном направлении к решению этой проблемы.

ArchersTH177 02.09.2018 19:54
0
2
120
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я предполагаю, что все правильно, кроме реализации адаптера.

Вы неправильно переопределяете эти методы, я позволю вам исправить это с помощью кода.

Код в ImagenAdapter:

//You need  to return the size of the array, if you always are returning 0 the adapter dont
        //print any because they "think" the array is empty.
        @Override
        public int getCount() {
            return nombreAnimal.size();
        }

        //This method helps you to return the Item at specific index
        @Override
        public Object getItem(int i) {
            return nombreAnimal.get(i);
        }

Надеюсь, это вам поможет.

По-прежнему, похоже, не работает, как вы думаете, с этим базовая часть адаптера должна работать правильно?

ArchersTH177 01.09.2018 23:03

Может ли ContraintLayout для основных элементов действия иметь какое-то отношение к этому? В учебнике использовался LinearLayout

ArchersTH177 01.09.2018 23:20

Вы должны обязательно добавить это в ImagenAdapter. Но, возможно, у вас что-то не так в вашем коде или макете xml.

Juanjo Berenguer 01.09.2018 23:22

Хорошо, я еще раз проверю свой код на наличие ошибок и попытаюсь выяснить, есть ли что-то в массиве. Спасибо за помощь

ArchersTH177 01.09.2018 23:55

Просмотрите свой BaseAdapter, как показано ниже; вы можете найти больше информации здесь

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

@Override
public Object getItem(int position) {
    return nombreAnimal.get(position);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // inflate the layout for each list row
    if (convertView == null) {
        convertView = layoutInflater.inflate(R.layout.activity_main_items, null);
    }

    TextView tvnombreAnimal = (TextView) 
        convertView.findViewById(R.id.tvnombreAnimal1);
    tvnombreAnimal.setText(nombreAnimal.get(i).toString());

    // returns the view for the current row
    return convertView;
}

Это тоже, похоже, не работает, idk, если массив может быть проблемой, как я могу поместить имена в обычное текстовое представление, чтобы проверить, есть ли данные?

ArchersTH177 02.09.2018 00:24

Можете ли вы распечатать эту строку, чтобы убедиться, что вы получите данные json jsonArray.getJSONObject(i).getString("nombreAnimal") @ ArchersTH177

misman 02.09.2018 01:06

Извините за незнание, но под этим вы имеете в виду отображение его в текстовом виде или что-то еще, где вы можете видеть данные?

ArchersTH177 02.09.2018 01:20

Да, просто распечатайте его в консоли отладки, используйте Log.v или System.out

misman 02.09.2018 01:47

Итак, я использовал строку для хранения этой строки, затем использовал журнал с тегом: "TAG" и id: "id" + (строка, которую я создал). Затем я запустил отладчик и поискал тег, и он дважды говорит: ViewPostImeInputStage ACTION_DOWN

ArchersTH177 02.09.2018 03:00

Последняя строка консоли отладчика выделена красным цветом, и в ней написано «sendUserActionEvent () mView == null», может быть, это ошибка?

ArchersTH177 02.09.2018 03:19

добавьте эту строку System.out.println("COMES DATA " + jsonArray.getJSONObject(i).getString("nombreAnimal")); перед nombreAnimal.add(jsonArray.getJSONObject(i).getString("nombr‌​eAnimal"));

misman 02.09.2018 10:30

Я не могу найти system.out.print, но нашел это в журнале «System.err: org.json.JSONException: Нет значения для nombreAnimal» «в org.json.JSONObject.get» и «в org.json.JSONObject. .getString ". Должен ли я опубликовать файл php, чтобы посмотреть, есть ли там какая-то ошибка?

ArchersTH177 02.09.2018 20:13

Исправлено, спасибо, что посоветовали мне проверить логарифм, вот как я обнаружил, что у моего массива проблема

ArchersTH177 02.09.2018 22:31

попробуйте этот код:

public class VerPostsUsuario extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_ver_posts_usuario);
    listView=(ListView)findViewById(R.id.listView);
    descargarImagen();


}

private ListView listView;

ArrayList nombreAnimal = new ArrayList();

private void descargarImagen(){
    nombreAnimal.clear();

final ProgressDialog progressDialog = new ProgressDialog(VerPostsUsuario.this);
progressDialog.setMessage("Cargando Datos");
progressDialog.show();

AsyncHttpClient client = new AsyncHttpClient();
client.get("mydomain+php", new AsyncHttpResponseHandler() {
    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
        if (statusCode==200){
            progressDialog.dismiss();
            try {
                JSONArray jsonArray = new JSONArray(new String(responseBody));
                for (int i=0; 1<jsonArray.length();i++){
                    nombreAnimal.add(jsonArray.getJSONObject(i).getString("nombreAnimal"));

                }
                listView.setAdapter(new ImagenAdapter(getApplicationContext(), nombreAnimal));

            } catch (JSONException e) {
                e.printStackTrace();
            }


        }
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {

    }
});

}

private class ImagenAdapter extends BaseAdapter {
    Context ctx;
    LayoutInflater layoutInflater;
    TextView tvnombreAnimal;
    ArrayList list;
public ImagenAdapter(Context applicationContext, ArrayList list) {
    this.ctx=applicationContext;
    this.list = list;
    layoutInflater=(LayoutInflater)ctx.getSystemService(LAYOUT_INFLATER_SERVICE);
}

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

@Override
public Object getItem(int i) {
    return list.get(i);
}

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

@Override
public View getView(int i, View convertView, ViewGroup parent) {

    ViewGroup viewGroup =(ViewGroup)layoutInflater.inflate(R.layout.activity_main_items, null);
   tvnombreAnimal = (TextView) viewGroup.findViewById(R.id.tvnombreAnimal1);

    tvnombreAnimal.setText(list.get(i).toString());







    return viewGroup;
}

Я только что добавил в ваш внутренний класс дополнительного Arraylist.

Пытался, но ничего не произошло, похоже, в коде нет ошибок, но по какой-то причине он не работает. Вы знаете, как поместить данные Array nombreAnimal в обычное текстовое представление, чтобы проверить, действительно ли на нем есть какие-либо данные?

ArchersTH177 02.09.2018 00:47
Ответ принят как подходящий

Я думаю, что что-то не так с массивом и тем, как вы обрабатываете ответ сервера. Вот как я заставил это работать.

Похоже, вы пытаетесь получить значение «nombreAnimal» вместо «Nombre». Попробуй это:

try {
     JSONArray jsonArray = new JSONArray(new String(responseBody));
     for (int i = 0; i < jsonArray.length(); i++) {
          nombreAnimal.add(jsonArray.getJSONObject(i).getString("Nombre"));
     }
     listView.setAdapter(new ImagenAdapter(getApplicationContext()));
} catch (JSONException e) {
     e.printStackTrace();
}

Пример работы со списком

Надеюсь, это вам поможет!

Да! Сейчас в журналах появляются значения, но показывает эту ошибку. Значение [{"Nombre": "Carlos"}, {"Nombre": "Juan"}] типа org.json.JSONArray не может быть преобразовано в JSONObject. Идентифицируйте, каким будет поле "результат" в моем случае

ArchersTH177 02.09.2018 20:52

Глядя на другие ваши комментарии, я заметил, что вы пытаетесь получить значение «nombreAnimal», и я думаю, вам следует указать «Nombre». Я обновлю свой ответ выше, чтобы вы могли видеть, каким должен быть код.

IsraelCast7 02.09.2018 21:41

Спасибо чувак!!! Наконец-то это сработало, вы были правы, это было поле, которое я поместил в файл php не из моей базы данных (в учебнике объясняется, что в этом поле я должен указать имя моего поля db). Вот почему это не сработало! Ты мне очень помог, чувак, им большое спасибо!

ArchersTH177 02.09.2018 21:57

Другие вопросы по теме