【发布时间】:2016-08-03 11:36:53
【问题描述】:
最近我学会了如何使用 Volley 库从数据库中获取信息。
所以我现在知道如何在 Activity 中从 php 脚本接收数据。
我的问题是在我的 Activity 上显示数据,我会解释它:
我有一个项目是创建一个包含新闻文章的网站的应用程序。
因此,在我的数据库中,我有一个名为 article 的表,其中包含很多文章。
当然,我不想在活动开始时全部加载它们,所以我编写了一个 php 脚本,将文章 5 到 5 发送到应用程序。脚本没问题。
在执行凌空 StringRequest 的请求类中,我收到这样的文章:String titles[] = new String[numberOfArticlesIWantToLoad]和String texts[] = new String[numberOfArticlesIWantToLoad]。
通过回调,我将它们发送到我的活动,并在带有适配器的 ListView 中显示它们。
适配器运行良好,但我不知道如何从我的数据库中加载更多项目并将它们显示在先前加载的文章下方...当我再次在我的数据库中执行请求时(它向我的活动发送 5下一篇文章),我再次调用适配器,显示新文章但不显示前一篇...
我知道我离我期望的答案不远了……
首先,我的脚本是否适合我的需要? 其次,我必须在我的适配器中进行哪些更改才能在以前的文章下面加载下一篇文章?
这对我很有帮助,在此先感谢您抽出时间来解决我的问题!
这是我的适配器:
public class MonAdapter extends ArrayAdapter<String>{
private final Context context;
private String[] values;
private String[] values2;
public MonAdapter(Context context, String[] values, String[] values2) {
super(context, -1, values);
this.context = context;
this.values = values;
this.values2 = values2;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.list_layout, parent, false);
TextView titre = (TextView) rowView.findViewById(R.id.titre);
TextView article = (TextView) rowView.findViewById(R.id.article);
titre.setText(values[position]);
article.setText(values2[position]);
return rowView;
}
public void addItems(String[] titres, String[] texts){
String[] listTitres = new String[this.values.length + titres.length];
String[] listTexts = new String[this.values2.length + texts.length];
for(int i=0;i<this.values.length;i++){
listTitres[i] = this.values[i];
listTexts[i] = this.values2[i];
}
for(int i=0;i<titres.length;i++){
listTitres[this.values.length+i] = titres[i];
listTexts[this.values.length+i] = texts[i];
}
this.values = listTitres;
this.values2 = listTexts;
}
}
这是我的活动,我从这里调用 StringRequest(在 MyRequest 类中)和适配器:
我尽量把不相关的代码去掉,希望不会太长
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
footerLayout = (RelativeLayout)getLayoutInflater().inflate(R.layout.footer_layout, null);
pb_charger = (ProgressBar)footerLayout.findViewById(R.id.pb_charger);
text = (TextView)findViewById(R.id.text);
pb_loader = (ProgressBar)findViewById(R.id.pb_loader);
list = (ListView)findViewById(R.id.list);
btn_charger = (Button)footerLayout.findViewById(R.id.btn_charger);
queue = VolleySingleton.getInstance(this).getRequestQueue();
request = new MyRequest(this, queue);
request.getArticles(nombreCharger, NOMBRE_ARTICLE_CHARGER, new MyRequest.GetArticlesCallback() {
@Override
public void onSuccess(String[] listeTitres, String[] listeArticles, boolean fin) {
*Some irrelevant code*
final MonAdapter adapterTitres = new MonAdapter(getApplicationContext(), listeTitres, listeArticles);
list.setAdapter(adapterTitres);
adapterTitres.notifyDataSetChanged();
list.addFooterView(footerLayout);
// list.removeFooterView(footerLayout);
}
nombreCharger++;
}
@Override
public void onError(String error, String id) {
}
});
btn_charger.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
btn_charger.setVisibility(View.INVISIBLE);
pb_charger.setVisibility(View.VISIBLE);
list.removeFooterView(footerLayout);
request.getArticles(nombreCharger, NOMBRE_ARTICLE_CHARGER, new MyRequest.GetArticlesCallback() {
@Override
public void onSuccess(String[] listeTitres, String[] listeArticles, boolean fin) {
*Some irrelevant code*
MonAdapter a = (MonAdapter) list.getAdapter();
a.addItems(listeTitres, listeArticles);
list.addFooterView(footerLayout);
list.setAdapter(a);
a.notifyDataSetChanged();
}
nombreCharger++;
}
@Override
public void onError(String error, String id) {
}
});
}
});
}
编辑:
这是更改后的错误:
04-12 22:47:34.640 12584-12584/com.example.thib.databaseaffichage E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.thib.databaseaffichage, PID: 12584
java.lang.ClassCastException: android.widget.HeaderViewListAdapter cannot be cast to com.example.thib.databaseaffichage.MonAdapter
at com.example.thib.databaseaffichage.MainActivity$2$1.onSuccess(MainActivity.java:142)
at com.example.thib.databaseaffichage.myrequest.MyRequest$1.onResponse(MyRequest.java:63)
at com.example.thib.databaseaffichage.myrequest.MyRequest$1.onResponse(MyRequest.java:39)
at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:67)
at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:30)
at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5292)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
at dalvik.system.NativeStart.main(Native Method)
【问题讨论】:
标签: android listview adapter android-volley