Я новичок в программировании, и я довольно долго пытался сделать эту работу, но мне не удалось ее решить, поэтому я хочу перенести данные (пока только имена) из моей онлайн-базы данных в список и отобразить его. Я уже проверил свой файл 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;)
Спасибо, я не заметил, это не работает, но это шаг в правильном направлении к решению этой проблемы.
Я предполагаю, что все правильно, кроме реализации адаптера.
Вы неправильно переопределяете эти методы, я позволю вам исправить это с помощью кода.
Код в 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);
}
Надеюсь, это вам поможет.
По-прежнему, похоже, не работает, как вы думаете, с этим базовая часть адаптера должна работать правильно?
Может ли ContraintLayout для основных элементов действия иметь какое-то отношение к этому? В учебнике использовался LinearLayout
Вы должны обязательно добавить это в ImagenAdapter. Но, возможно, у вас что-то не так в вашем коде или макете xml.
Хорошо, я еще раз проверю свой код на наличие ошибок и попытаюсь выяснить, есть ли что-то в массиве. Спасибо за помощь
Просмотрите свой 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, если массив может быть проблемой, как я могу поместить имена в обычное текстовое представление, чтобы проверить, есть ли данные?
Можете ли вы распечатать эту строку, чтобы убедиться, что вы получите данные json jsonArray.getJSONObject(i).getString("nombreAnimal") @ ArchersTH177
Извините за незнание, но под этим вы имеете в виду отображение его в текстовом виде или что-то еще, где вы можете видеть данные?
Да, просто распечатайте его в консоли отладки, используйте Log.v или System.out
Итак, я использовал строку для хранения этой строки, затем использовал журнал с тегом: "TAG" и id: "id" + (строка, которую я создал). Затем я запустил отладчик и поискал тег, и он дважды говорит: ViewPostImeInputStage ACTION_DOWN
Последняя строка консоли отладчика выделена красным цветом, и в ней написано «sendUserActionEvent () mView == null», может быть, это ошибка?
добавьте эту строку System.out.println("COMES DATA " + jsonArray.getJSONObject(i).getString("nombreAnimal")); перед nombreAnimal.add(jsonArray.getJSONObject(i).getString("nombreAnimal"));
Я не могу найти system.out.print, но нашел это в журнале «System.err: org.json.JSONException: Нет значения для nombreAnimal» «в org.json.JSONObject.get» и «в org.json.JSONObject. .getString ". Должен ли я опубликовать файл php, чтобы посмотреть, есть ли там какая-то ошибка?
Исправлено, спасибо, что посоветовали мне проверить логарифм, вот как я обнаружил, что у моего массива проблема
попробуйте этот код:
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 в обычное текстовое представление, чтобы проверить, действительно ли на нем есть какие-либо данные?
Я думаю, что что-то не так с массивом и тем, как вы обрабатываете ответ сервера. Вот как я заставил это работать.
Похоже, вы пытаетесь получить значение «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. Идентифицируйте, каким будет поле "результат" в моем случае
Глядя на другие ваши комментарии, я заметил, что вы пытаетесь получить значение «nombreAnimal», и я думаю, вам следует указать «Nombre». Я обновлю свой ответ выше, чтобы вы могли видеть, каким должен быть код.
Спасибо чувак!!! Наконец-то это сработало, вы были правы, это было поле, которое я поместил в файл php не из моей базы данных (в учебнике объясняется, что в этом поле я должен указать имя моего поля db). Вот почему это не сработало! Ты мне очень помог, чувак, им большое спасибо!
Обратите внимание, что в
for (int i=0; 1<jsonArray.length();i++){есть небольшая ошибка, это должно бытьi<jsonArray.length(). Надеюсь, это поможет!