我是编程的新手,我一直试图让这个工作很长一段时间,但我还没有能够解决它,所以,我想将数据(现在只是名字)从我的在线数据库传输到列表视图并显示它。我已经检查了我的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;
}
活动PostPostUsario 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”而不是“我”,不得不更换
我试图从db中获取一个名为“nombreAnimal”的字段,实际上在我的php文件中我将“nombreAnimal”指定为“Nombre”(nombreAnimal.add(jsonArray.getJSONObject(i).getString(“Nombre”)) ;)
我还发现检查你的Array是否具有你想要的值(或者至少是某些东西)的最佳方法是检查Android的Logcat
-BaseAdapter:
我忘了在getCount(Array.size;)中从我的数组中获取大小
我在getItem中忘记了我需要从我的数组“nombreAnimal”(Array.get(i);)中返回“position”,“i”。
我忘了在getItemdId中返回“i”(i;)
我认为数组有问题以及如何处理服务器响应。这就是我的工作方式。
好像你试图获得值“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();
}
我希望它对你有所帮助!
我假设一切都是正确的,除了适配器的实现。
你没有正确地覆盖这些方法,我让你的代码来解决它。
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);
}
我希望它对你有所帮助。
查看您的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;
}
尝试该代码:
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。