I couldn't find a way to get live updates via JSON to a listview.
My activity is requesting JSON data from a webpage and the code is:
public class Second extends Activity {
static final String Li_nk = "LinkName:";
static final String Image_name = "ImageName:";
ListView list;
public final static String AUTH = "authentication";
static final String KEY_THUMB_URL = "thumb_image"; // Uri.decode("http://zeesms.info/android_app_images/Koala.jpg");
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent i2 = getIntent();
String wrd = i2.getStringExtra("entrd");
Log.v("keyis", wrd);
// if(wrd.equalsIgnoreCase("test")){
JSONObject j2 = JSONfunctions.getJSONfromURL("/webservice_search.php?keyword=" + wrd + "&format=json");
ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
try {
JSONArray jray = j2.getJSONArray("listings");
for (int i = 0; i < jray.length(); i++) {
Log.v("state", "json data being read");
JSONObject j3 = jray.getJSONObject(i);
String first = j3.getString("listing");
Log.v("sublist", first);
JSONObject j4 = j3.getJSONObject("listing");
String sec = j4.getString("links");
int maxLength = (sec.length() < 30) ? sec.length() : 27;
sec.substring(0, maxLength);
String cutsec = sec.substring(0, maxLength);
Log.v("links are", cutsec);
String img = j4.getString("image_name");
Log.v("image name is ", img);
// Uri
// dimg=Uri.parse("http://zeesms.info/android_app_images/Koala.jpg");
HashMap<String, String> map = new HashMap<String, String>();
map.put("Id", String.valueOf(i));
map.put(Li_nk, cutsec);
map.put(Image_name, j4.getString("image_name"));
map.put(KEY_THUMB_URL, "http://zeesms.info/android_app_images/" + img);
mylist.add(map);
}
}
catch (JSONException e) {
alertbox();
Log.e("loG_tag", "Error parsing" + e.toString());
}
list = (ListView) findViewById(R.id.lv1);
this.list.setEmptyView(findViewById(R.id.empty));
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// Toast.makeText(getApplicationContext(),"Click ListItem Number "
// + position, Toast.LENGTH_LONG).show();
Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.riffre.com/"));
startActivity(myIntent);
}
});
LazyAdapter adapter = new LazyAdapter(this, mylist);
list.setAdapter(adapter);
list.setItemsCanFocus(false);
// }
/*
* else{ alertbox(); }
*/
}
/*
* public void register(View view) { Log.w("C2DM",
* "start registration process"); Intent intent = new
* Intent("com.google.android.c2dm.intent.REGISTER");
* intent.putExtra("app", PendingIntent.getBroadcast(this, 0, new
* Intent(), 0)); // Sender currently not used intent.putExtra("sender",
* "[email protected]"); startService(intent); }
*
* public void showRegistrationId(View view) { SharedPreferences prefs =
* PreferenceManager .getDefaultSharedPreferences(this); String string =
* prefs.getString(AUTH, "n/a"); Toast.makeText(this, string,
* Toast.LENGTH_LONG).show(); Log.d("C2DM RegId", string);
*
* }
*/
public void alertbox() {
new AlertDialog.Builder(this).setMessage("Invalid Keyword,No Results found").setTitle("Alert").setCancelable(true).setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
finish();
}
}).show();
}
}
and I'm using a custom adapter with the code as follows:
public class LazyAdapter extends BaseAdapter {
private Activity activity;
private ArrayList<HashMap<String, String>> data;
private static LayoutInflater inflater=null;
public ImageLoader imageLoader;
public LazyAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
activity = a;
data=d;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
imageLoader=new ImageLoader(activity.getApplicationContext());
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return data.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
if(convertView==null)
vi = inflater.inflate(R.layout.custom_row_view1, null);
TextView title = (TextView)vi.findViewById(R.id.linkname); // merchnts name
TextView artist = (TextView)vi.findViewById(R.id.imagename); // address
//TextView duration = (TextView)vi.findViewById(R.id); // distance
ImageView thumb_image=(ImageView)vi.findViewById(R.id.mClogo); // logo
HashMap<String, String> jsn = new HashMap<String, String>();
jsn = data.get(position);
// Setting all values in listview
title.setText(jsn.get(Second.Li_nk));
artist.setText(jsn.get(Second.Image_name));
//duration.setText(song.get(CustomizedListView.KEY_DURATION));
imageLoader.DisplayImage(jsn.get(Second.KEY_THUMB_URL), thumb_image);
return vi;
}
}
What I want is that the application updates the listview with data every minute or so. Also the latest entry in the list should stay on top.
What would be the best way to do this?
Put your JSON parsing code, that's probably your try..catch
block in a separate function and not in onCreate()
.
So can easily call that part every minute. let's say that function name LoadData()
also add one more line adapter.notifyDataSetChanged()
to update adapter/list every time.
now in your onCreate(), write this code to call that function every one minute,
final Handler handler = new Handler();
Runnable runable = new Runnable() {
@Override
public void run() {
//call the function
LoadData();
//also call the same runnable
handler.postDelayed(this, 1000);
}
};
handler.postDelayed(runable, 1000);
Now for second problem, to add new data at top..
I am just getting one thing in mind right now to write a loop , ADD THIS TO IN YOUR FUNCTION BEFORE CALLING ADAPTER NOTIFY CHANGE,like
ArrayList<HashMap<String,String>> mylist = new ArrayList<HashMap<String,String>>();
ArrayList<HashMap<String,String>> mylistTemp = new ArrayList<HashMap<String,String>>();
for(int i = mylist.size()-1 ; i >=0;i--)
{
mylistTemp.add(mylist.get(i));
}
mylist = mylistTemp;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With