Недавно я узнал, как получать информацию из базы данных с помощью библиотеки Volley.
Итак, теперь я знаю, как получать данные из 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)