リスト ビューが最後までスクロールされたときに、リスト ビューが動的に表示するアイテムの数を増やしたいと考えています。私の場合、リストビューには最初に 10 個のアイテムが表示されます。次に、最後のアイテムまでスクロールすると、さらに 10 個のアイテムが表示され始めます。どうやってやるの??
これが私のカスタム配列アダプターです
package com.android.listview;
import java.util.ArrayList;
import com.android.listview.R;
import com.android.listview.Product;
import android.widget.ArrayAdapter;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.android.listview.ListViewActivity;
public class CustomArrayAdapter extends ArrayAdapter<Product> implements
OnScrollListener {
private final Context context;
private final ArrayList<Product> values;
static class ViewHolder {
public TextView text;
public ImageView image;
}
public CustomArrayAdapter(Context arg0, int arg1, int arg2,
ArrayList<Product> arg3) {
super(arg0, arg1, arg2, arg3);
this.context = arg0;
this.values = arg3;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
int product_id = 0;
View rowView = inflater.inflate(R.layout.feed_items, parent, false);
try {
ImageView wic_logo = (ImageView) rowView.findViewById(R.id.logo);
TextView label = (TextView) rowView.findViewById(R.id.label);
Product p = values.get(position);
product_id = p.productId;
String date = new java.text.SimpleDateFormat("dd/MM/yy")
.format(new java.util.Date(p.timeStamp));
label.setText(p.productName + "\n" + p.reportedPrice + " MRP: "
+ p.mrp + "\n" + "Discount: " + p.discount + "% "
+ p.area + " " + p.city + "\n" + "Shared by " + p.userName
+ " " + "on" + " " + date);
wic_logo.setImageResource(R.drawable.wic_logo_small);
Log.d("date", "" + date);
Log.d("Custom Array Adapter", "at" + position);
} catch (Exception e) {
Log.d("Custom Array Adapter", "catch");
}
return rowView;
}
public void onScroll(AbsListView arg0, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
Log.d("entered onScroll", " " + firstVisibleItem + visibleItemCount
+ totalItemCount);
if (((firstVisibleItem + visibleItemCount) >= totalItemCount - 1)) {
Log.d("entered if", " " + firstVisibleItem + visibleItemCount
+ totalItemCount);
// if we're at the bottom of the listview, load more data
addData(totalItemCount, values.get(totalItemCount).productId);
}
}
private void addData(int totalItemCount, int productId) {
Toast.makeText(getContext(), "last item", Toast.LENGTH_SHORT).show();
}
public void onScrollStateChanged(AbsListView arg0, int arg1) {
}
}
ここに私の活動があります
package com.android.listview;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.android.listview.CustomArrayAdapter;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.Button;
import android.widget.ListView;
public class ListViewActivity extends Activity {
static Product[] feed_products_list;
private JSONArray JArray;
private InputStream is;
private StringBuilder sb;
private String result;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button feed_button = (Button) findViewById(R.id.feedButton_feed);
feed_button.setBackgroundResource(R.color.grey);
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://10.0.2.2/wic2/mobile/feed");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
ResponseHandler<String> responseHandler = new BasicResponseHandler();
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(is, "iso-8859-1"), 8);
sb = new StringBuilder();
sb.append(reader.readLine() + "\n");
String line = "0";
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
result = sb.toString();
Log.d("result", result);
} catch (Exception e) {
Log.e("error", "Error in http connection" + e.toString());
}
Log.e("response", "response is:" + response.toString());
} catch (Exception e) {
Log.e("error", "Error in http connection" + e.toString());
}
ListView tv = (ListView) findViewById(R.id.feedListView);
try {
Log.d("JArray", "entered try");
JArray = new JSONArray(result);
int length = JArray.length();
feed_products_list = new Product[length+1];
Log.d("JArray", "try last line");
} catch (JSONException e) {
Log.d("JArray", "in catch");
e.printStackTrace();
}
JSONObject jsonObj;
for (int i = 0; i < JArray.length(); i++) {
try {
Log.d("jsonObj", "entered try");
jsonObj = JArray.getJSONObject(i);
} catch (Exception e) {
Log.d("jsonObj", "in catch");
continue;
}
try {
Log.d("feed_products_list", "entered try");
feed_products_list[i] = new Product(jsonObj.getInt("id"),
jsonObj.getString("image"),
jsonObj.getString("product_name"),
jsonObj.getString("reported_price_formated"),
jsonObj.getString("store_area"),
jsonObj.getString("store_city"),
jsonObj.getString("mrp"),
jsonObj.getString("user_name"),
jsonObj.getLong("reported_timestamp"),
jsonObj.getInt("discount"));
Log.d("feed_products_list", feed_products_list[i].productName);
} catch (JSONException e) {
Log.d("feed_products_list in catch",
feed_products_list[i].productName);
e.printStackTrace();
}
}
tv.setAdapter(new CustomArrayAdapter(this, R.layout.feed_items,
R.id.label, feed_products_list));
}
}
もう 1 つの問題は、配列 feed_products_list[length] を JArray 内の項目数で初期化する必要があることです。そのため、最後の項目までスクロールしてリスト全体を再入力するたびに配列サイズを変更することはできません