从在线数据库填充列表视图

时间:2018-09-01 20:09:45

标签: android listview

我是编程新手,我一直在努力使其工作一段时间,但是我无法解决它,因此,我想将数据(现在仅是名称)从我的在线数据库传输到列表视图并显示它。我已经检查了我的php文件,它可以正常工作(它返回我想要的名称),代码也可以正常工作,直到到达Baseadapter部分为止。

活动VerPostsUsuario

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 “));)

我还发现,检查数组是否具有所需值(或至少是某些值)的最佳方法是检查Android的Logcat

-BaseAdapter:

我忘了从数组中的 getCount (Array.size;)

中获取大小。

我忘记了 getItem ,我需要从我的数组“ nombreAnimal”(Array.get(i);)中返回“ position”(在我的情况下为“ i”)

我忘记了 getItemdId 以返回“ i”(i;)

4 个答案:

答案 0 :(得分:1)

我假设除了适配器的实现以外,其他所有信息都是正确的。

您没有正确覆盖这些方法,我让您通过代码对其进行修复。

ImagenAdapter中的代码:

() -> this.enabled
this::enabled

希望对您有帮助。

答案 1 :(得分:0)

按以下方式查看您的BaseAdapter;您可以找到更多信息here

@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;
}

答案 2 :(得分:0)

尝试该代码:

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。

答案 3 :(得分:0)

我认为数组以及处理服务器响应的方式有问题。这就是我的工作方式。

似乎您正在尝试获取值“ 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();
}

Example of list working

希望对您有帮助!