I have been working on an android project where I need to fetch data from server and display in a listview. The first retrieval is done successfully but from second retrieval onwards the fetched data's are placed below the previously fetched data. How can I refresh the listview to view the fetched data in the listview? The codes I used are given below.
package com.example.sohan.patient;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Sohan on 5/20/2016.
*/
public class Doctors_layout extends Fragment implements AdapterView.OnItemSelectedListener{
View myView;
Spinner spinner;
String selectedCity;
Context myContext;
String jsonResult;
JSONObject jsonObject;
JSONArray jsonArray;
ContactAdapter contactAdapter;
String JSON_String;
ListView listView;
Button button;
int check=0;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
myView = inflater.inflate(R.layout.doctors_directory, container, false);
myContext = inflater.getContext();
contactAdapter = new ContactAdapter(myContext, R.layout.row_layout);
spinner = (Spinner)myView.findViewById(R.id.spinner);
listView = (ListView)myView.findViewById(R.id.listView);
listView.setAdapter(contactAdapter);
spinner.setOnItemSelectedListener(this);
List<String> city = new ArrayList<String>();
city.add("Choose a City");
city.add("Chittagong");
city.add("Dhaka");
ArrayAdapter<String> aAdapter = new ArrayAdapter<String>(myContext, android.R.layout.simple_spinner_item ,city);
aAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(aAdapter);
return myView;
}
#Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
//contactAdapter.notifyDataSetChanged();
if(check==0) {
((TextView) parent.getChildAt(0)).setTextSize(21);
if (position == 0) {
nothing();
} else {
check++;
selectedCity = parent.getItemAtPosition(position).toString();
Toast.makeText(myContext, "Check value: "+check, Toast.LENGTH_LONG).show();
retrieveInfo ri = new retrieveInfo();
ri.execute(selectedCity); // notifydata
}
}
else{
contactAdapter.notifyDataSetChanged();
selectedCity = parent.getItemAtPosition(position).toString();
retrieveInfo ri = new retrieveInfo();
ri.execute(selectedCity);
}
}
#Override
public void onNothingSelected(AdapterView<?> parent) {
}
public void nothing(){
//Toast.makeText(myContext, "Default position 0", Toast.LENGTH_LONG).show();
}
class retrieveInfo extends AsyncTask<String, Void, String> { // send data to server
String myUrl;
protected void onPreExecute() {
myUrl ="http://bdpricelist.com/patient/retrieveMedicalName.php"; // change php script
}
protected String doInBackground(String... args) {
String city;
String result = null;
city = args[0];
JSONArray jsonArray = null;
try{
URL url = new URL(myUrl);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setDoOutput(true);
OutputStream outputStream = httpURLConnection.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
String data_to_send = URLEncoder.encode("city", "UTF-8")+"="+URLEncoder.encode(city,"UTF-8");
bufferedWriter.write(data_to_send);
bufferedWriter.flush();
bufferedWriter.close();
outputStream.close();
InputStream is = httpURLConnection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"), 8);
StringBuilder sb = new StringBuilder();
while ((JSON_String = reader.readLine()) != null)
{
sb.append(JSON_String+"\n");
}
reader.close();
httpURLConnection.disconnect();
is.close();
return sb.toString().trim();
}catch(MalformedURLException e){
e.printStackTrace();
}catch(IOException f){
f.printStackTrace();
}
return null;
}
protected void onPostExecute(String result) {
jsonResult = result;
parseJSON(jsonResult);
//jsonResult="";
}
}
public void delete(String city) {
Fragment Dl = new Doctors_layout();
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.content_frame, Dl);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
public void parseJSON(String json){
Contacts contacts=null;
try {
jsonObject = new JSONObject(json);
jsonArray = jsonObject.getJSONArray("patient");
int count = 0;
String name;
while (count < jsonArray.length()) {
JSONObject jo = jsonArray.getJSONObject(count);
name = jo.getString("Medical"); // data's are send to store in and print in listview
contacts = new Contacts(name);
contactAdapter.add(contacts);
count++;
}
//contactAdapter.add(contacts.getMedicalName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
And my adapter class is given below
package com.example.sohan.patient;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Sohan on 6/9/2016.
*/
public class ContactAdapter extends ArrayAdapter {
//ContactHolder contactHolder;
List list = new ArrayList();
ContactAdapter contactAdapter;
List receivedList = new ArrayList();
View row;
ContactHolder contactHolder;
int count =0;
public ContactAdapter(Context context, int resource) {
super(context, resource);
}
public void add(Contacts object) {
// list.clear();
super.add(object);
list.add(object);
//notifyDataSetChanged();
Toast.makeText(getContext().getApplicationContext(), "Entry without delete ", Toast.LENGTH_SHORT).show();
}
#Override
public int getCount() {
return list.size();
}
#Override
public void clear() {
super.clear();
}
#Override
public boolean isEmpty() {
return super.isEmpty();
}
#Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
}
public void deleteEntry(){
list.clear();
Toast.makeText(getContext().getApplicationContext(), "List cleared before entry ", Toast.LENGTH_SHORT).show();
}
#Override
public Object getItem(int position) {
return list.get(position);
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
//count++;
row = convertView;
if(row==null){
LayoutInflater layoutInflater = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = layoutInflater.inflate(R.layout.row_layout,parent,false);
contactHolder = new ContactHolder();
contactHolder.MedicalName =(TextView) row.findViewById(R.id.textView5);
row.setTag(contactHolder);
}
else{
contactHolder = (ContactHolder)row.getTag();
}
contactHolder = new ContactHolder();
contactHolder.MedicalName =(TextView) row.findViewById(R.id.textView5);
Contacts contacts = (Contacts)this.getItem(position);
contactHolder.MedicalName.setText(contacts.getMedicalName());
return row;
}
static class ContactHolder{
TextView MedicalName;
}
}
Instead of having add(Contacts object) in your adapter, have a method where you clear the current items in the list and update with the newly retrieved items.
private void updateContactList(List<Contacts> updatedList) {
list.clear();
list.addAll(updatedList);
notifyDataSetChanged();
}
and inside parseJSON(String json)
List<Contacts> newList = new ArrayList<>();
while (count < jsonArray.length()) {
JSONObject jo = jsonArray.getJSONObject(count);
name = jo.getString("Medical");
contacts = new Contacts(name);
newList.add(contacts);
count++;
}
contactAdapter.updateContactList(newList);
The new data is being shown after the old data because you are adding new data to the existing one in parseJSON().
If you want to replace the old data with new one then remove these lines from onCreateView and add inside parseJSON(), right after while loop.
contactAdapter = new ContactAdapter(myContext, R.layout.row_layout);
listView.setAdapter(contactAdapter);
Related
in my android project I am using a custom listview where all the values are retrieved from the server and displayed in the listview. I have a button along with the textview in the listview entries, now I want to functionality of the button to be like when I click it will take the value from any textview of the same group and display it in the alert box. I retrieved the data and displayed successfully but I'm not able crack how to use the button to get the textview values of the list.. Thanks in advance for any help... My codes are posted below.
This is my contact adapter class:
package com.example.sohan.doctor;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Sohan on 6/9/2016.
*/
public class ContactAdapter extends ArrayAdapter {
notification nt = new notification();
List list = new ArrayList();
View row;
ContactHolder contactHolder;
public ContactAdapter(Context context, int resource) {
super(context, resource);
}
public void add(List<Contacts> updatedList) {
list.clear();
list.addAll(updatedList);
notifyDataSetChanged();
}
#Override
public Object getItem(int position) {
return list.get(position);
}
#Override
public int getCount() {
return list.size();
}
#Override
public View getView(final int position, View convertView, ViewGroup parent) {
row = convertView;
if(row==null){
LayoutInflater layoutInflater = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = layoutInflater.inflate(R.layout.view_symptom_layout,parent,false);
contactHolder = new ContactHolder();
contactHolder.Name =(TextView) row.findViewById(R.id.textView2);
contactHolder.Age =(TextView) row.findViewById(R.id.textView3);
contactHolder.Height =(TextView) row.findViewById(R.id.textView4);
contactHolder.Weight =(TextView) row.findViewById(R.id.textView5);
contactHolder.Symptom =(TextView) row.findViewById(R.id.textView6);
contactHolder.button = (Button) row.findViewById(R.id.button3);
contactHolder.button.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
String name;
name = nt.newList.get(position).getName(); // This is where I'm stucked.
Toast.makeText(getContext().getApplicationContext(), name+" is served ", Toast.LENGTH_LONG).show();
}
});
row.setTag(contactHolder);
}
else{
contactHolder = (ContactHolder)row.getTag();
}
Contacts contacts = (Contacts)this.getItem(position);
contactHolder.Name.setText("Name: "+contacts.getName());
contactHolder.Age.setText("Age: "+contacts.getAge());
contactHolder.Height.setText("Height: "+contacts.getHeight());
contactHolder.Weight.setText("Weight: "+contacts.getWeight());
contactHolder.Symptom.setText("Symptoms: "+contacts.getSymptom());
return row;
}
static class ContactHolder{
TextView Name;
TextView Age;
TextView Height;
TextView Weight;
TextView Symptom;
Button button;
}
}
And this is the class where I retrieve all the values from server and store it in listview:
package com.example.sohan.doctor;
import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Sohan on 6/25/2016.
*/
public class notification extends Fragment implements AdapterView.OnItemSelectedListener{
public final static String Message = "Sohan";
View myView;
String selectedCity;
Context myContext;
String jsonResult;
JSONObject jsonObject;
JSONArray jsonArray;
String JSON_String;
ContactAdapter contactAdapter;
ListView listView;
List<Contacts> newList;
Button button;
String send;
public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
myView = inflater.inflate(R.layout.notification, container, false);
myContext = inflater.getContext();
contactAdapter = new ContactAdapter(myContext, R.layout.view_symptom_layout);
listView = (ListView)myView.findViewById(R.id.listView);
listView.setAdapter(contactAdapter);
retrieveInfo ri = new retrieveInfo();
ri.execute();
return myView;
}
#Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
}
#Override
public void onNothingSelected(AdapterView<?> parent) {
}
class retrieveInfo extends AsyncTask<Void, Void, String> { // send data to server
String myUrl;
protected void onPreExecute() {
myUrl ="httP://myserver.com"; // change php script
}
protected String doInBackground(Void... args) {
String city;
String result = null;
JSONArray jsonArray = null;
try{
URL url = new URL(myUrl);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setDoOutput(true);
OutputStream outputStream = httpURLConnection.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
// String data_to_send = URLEncoder.encode("city", "UTF-8")+"="+URLEncoder.encode(city,"UTF-8");
//bufferedWriter.write(data_to_send);
bufferedWriter.flush();
bufferedWriter.close();
outputStream.close();
InputStream is = httpURLConnection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"), 8);
StringBuilder sb = new StringBuilder();
while ((JSON_String = reader.readLine()) != null)
{
sb.append(JSON_String+"\n");
}
reader.close();
httpURLConnection.disconnect();
is.close();
return sb.toString().trim();
}catch(MalformedURLException e){
e.printStackTrace();
}catch(IOException f){
f.printStackTrace();
}
return null;
}
protected void onPostExecute(String result) {
jsonResult = result;
parseJSON(jsonResult);
}
}
public void parseJSON(String json){
Contacts contacts=null;
try {
jsonObject = new JSONObject(json);
jsonArray = jsonObject.getJSONArray("patient");
int count = 0;
String name,age,height,weight,symptom;
newList = new ArrayList<Contacts>();
while (count < jsonArray.length()) {
JSONObject jo = jsonArray.getJSONObject(count);
name = jo.getString("Name"); // data's are send to store in and print in listview
age = jo.getString("Age");
height = jo.getString("Height");
weight = jo.getString("Weight");
symptom = jo.getString("Symptom");
contacts = new Contacts(name,age,height,weight,symptom);
newList.add(contacts); // data are stored in the newlist array
count++;
}
contactAdapter.add(newList); // the newlist array are send to add in the listview
} catch (Exception e) {
e.printStackTrace();
}
}
}
You can make some more changes like following.
ContactAdapter extends ArrayAdapter<Contacts>
List<Contacts> list = new ArrayList<Contacts>();
And this line:
String name,age,height,weight,symptom;
You should put in while loop with initialize as null ""
name = nt.newList.get(position).getName();
I think it should be:
name = list.get(position).getName();
You cam also read this article:
ListView with Add and Delete Buttons in each Row in android
I have gridview for a tab in tabLayout. I load the values from mysql database to fill the textviews of gridview. I see that the JSON parsing runs correctly and returns correct JSON result. But nothing shows up in grid view.
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.mysampleapp.R;
import java.util.ArrayList;
public class GridAdapterStores extends BaseAdapter {
private Context context;
private ArrayList<String> storename=new ArrayList<String>();
private ArrayList<Integer> imagelinks=new ArrayList<Integer>();
public GridAdapterStores(Context c,ArrayList<String> storename, ArrayList<Integer> imagelinks) {
context = c;
this.imagelinks = imagelinks;
this.storename = storename;
}
#Override
public int getCount() {
return storename.size();
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
public View getView(int position, View convertView, ViewGroup parent){
View grid;
if (convertView == null) {
grid = new View(context);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
grid = inflater.inflate(R.layout.grid_stores,parent,false);
}
else {
grid = (View) convertView;
}
TextView textViewStoreName = (TextView) grid.findViewById(R.id.store_name);
ImageView imageViewStoreImage = (ImageView) grid.findViewById(R.id.store_image);
textViewStoreName.setText(storename.get(position));
Integer x=imagelinks.get(position);
imageViewStoreImage.setImageResource(x);
return grid;
}
}
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.support.v4.app.Fragment;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.Toast;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.widget.AdapterView.OnItemClickListener;
import android.view.View.OnClickListener;
import com.mysampleapp.R;
import java.util.ArrayList;
public class StoresFragment extends Fragment {
private ProgressDialog loading;
private ArrayList<String> storenamefinal=new ArrayList<String>();
private ArrayList<Integer> imagelinksfinal=new ArrayList<Integer>();
#Nullable
#Override
public View onCreateView(LayoutInflater inflater , ViewGroup container,Bundle savedInstanceState){
return inflater.inflate(R.layout.stores_layout,null);
}
#Override
public void onViewCreated(final View view, final Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);
GridView gridview=(GridView) getActivity().findViewById(R.id.grid_stores);
getData();
final GridAdapterStores gridadapter= new GridAdapterStores(getActivity(),storenamefinal,imagelinksfinal);
gridview.setAdapter(gridadapter);
gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
/* Intent i=new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(gridadapter.getItem(position).getImageUrlString()));
startActivity(i);}});*/
// Toast.makeText(getActivity(), "You Clicked at " + cat[+position], Toast.LENGTH_SHORT).show();
Intent i = new Intent(getActivity(), stores_show.class);
i.putExtra("storename", storenamefinal.get(position));
getActivity().startActivity(i);
}
});
}
//public class getData extends AsyncTask<String,>>{
//}
private void getData() {
loading = ProgressDialog.show(getActivity(), "Please wait...", "Fetching...", false, false);
String url = Config1.DATA_URL;
Toast.makeText(getActivity(), url, Toast.LENGTH_LONG).show();
StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() {
#Override
public void onResponse(String response) {
loading.dismiss();
showJSON(response);
}
},
new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getActivity(),error.getMessage().toString(),Toast.LENGTH_LONG).show();
}
});
RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
requestQueue.add(stringRequest);
}
private void showJSON(String response) {
try {
JSONObject jsonObject = new JSONObject(response);
JSONArray result = jsonObject.getJSONArray(Config1.JSON_ARRAY);
Toast.makeText(getActivity(),result.toString(),Toast.LENGTH_LONG).show();
int i=result.length();
Log.i("Result Length",result.toString());
for(int j=0;j<i;j++){
storenamefinal.add(null);
imagelinksfinal.add(null);
}
String temp;
for(int j=0;j<i;j++)
{
JSONObject Data = result.getJSONObject(j);
Log.i("Data",Data.toString());
temp= (Data.getString(Config1.KEY_PRIO));
Log.i("temp", temp.toString());
storenamefinal.set(Integer.parseInt(temp) - 1, Data.getString(Config1.KEY_NAME));
Log.i("Result Length", storenamefinal.toString());
imagelinksfinal.add(R.drawable.sg1);
}
Log.i("Result Length", storenamefinal.toString());
Toast.makeText(getActivity(),storenamefinal.get(0),Toast.LENGTH_LONG).show();
} catch (JSONException e) {
e.printStackTrace();
}
}
}
I have tried searching on Google and stackoverflow , found nothing successful,
{"result":[{"storename":"Flipkart.com","imagelinks":"","mainpriority":"2"},{"storename":"Jabong.com","imagelinks":"","mainpriority":"4"},{"storename":"Myntra.com","imagelinks":"","mainpriority":"5"},{"storename":"Amazon.in","imagelinks":"","mainpriority":"1"},{"storename":"Snapdeal.com","imagelinks":"","mainpriority":"3"},{"storename":"Koovs.in","imagelinks":"","mainpriority":"6"},{"storename":"Limeroad.com","imagelinks":"","mainpriority":"7"},{"storename":"Shopperstop.com","imagelinks":"","mainpriority":"8"},{"storename":"Stalkbuylove.com","imagelinks":"","mainpriority":"9"},{"storename":"Yepme.com","imagelinks":"","mainpriority":"10"},{"storename":"Faballey.com","imagelinks":"","mainpriority":"11"},{"storename":"Fabindia.com ","imagelinks":"","mainpriority":"12"},{"storename":"PrettySecrets.com","imagelinks":"","mainpriority":"13"},{"storename":"AmericanSwan.com","imagelinks":"","mainpriority":"14"},{"storename":"Clovia.com","imagelinks":"","mainpriority":"15"},{"storename":"Bata.in","imagelinks":"","mainpriority":"16"},{"storename":"TrendyBharat.com","imagelinks":"","mainpriority":"17"},{"storename":"Royzez.com","imagelinks":"","mainpriority":"18"}]}
`
Storenamefinal will have entries of storenames from resulting JSON(above)
I tried your code and it crashes the application
after debugging i got that the problem is with the image resources
when i commented below two lines the app works fine.
//check these resources
Integer x=imagelinks.get(position);
imageViewStoreImage.setImageResource(x);
your showJSON() function that i tried
private void showJSON() {
try {
String response ="{\"result\":[{\"storename\":\"Flipkart.com\",\"imagelinks\":\"\",\"mainpriority\":\"2\"},{\"storename\":\"Jabong.com\",\"imagelinks\":\"\",\"mainpriority\":\"4\"},{\"storename\":\"Myntra.com\",\"imagelinks\":\"\",\"mainpriority\":\"5\"},{\"storename\":\"Amazon.in\",\"imagelinks\":\"\",\"mainpriority\":\"1\"},{\"storename\":\"Snapdeal.com\",\"imagelinks\":\"\",\"mainpriority\":\"3\"},{\"storename\":\"Koovs.in\",\"imagelinks\":\"\",\"mainpriority\":\"6\"},{\"storename\":\"Limeroad.com\",\"imagelinks\":\"\",\"mainpriority\":\"7\"},{\"storename\":\"Shopperstop.com\",\"imagelinks\":\"\",\"mainpriority\":\"8\"},{\"storename\":\"Stalkbuylove.com\",\"imagelinks\":\"\",\"mainpriority\":\"9\"},{\"storename\":\"Yepme.com\",\"imagelinks\":\"\",\"mainpriority\":\"10\"},{\"storename\":\"Faballey.com\",\"imagelinks\":\"\",\"mainpriority\":\"11\"},{\"storename\":\"Fabindia.com \",\"imagelinks\":\"\",\"mainpriority\":\"12\"},{\"storename\":\"PrettySecrets.com\",\"imagelinks\":\"\",\"mainpriority\":\"13\"},{\"storename\":\"AmericanSwan.com\",\"imagelinks\":\"\",\"mainpriority\":\"14\"},{\"storename\":\"Clovia.com\",\"imagelinks\":\"\",\"mainpriority\":\"15\"},{\"storename\":\"Bata.in\",\"imagelinks\":\"\",\"mainpriority\":\"16\"},{\"storename\":\"TrendyBharat.com\",\"imagelinks\":\"\",\"mainpriority\":\"17\"},{\"storename\":\"Royzez.com\",\"imagelinks\":\"\",\"mainpriority\":\"18\"}]} ";
JSONObject jsonObject = new JSONObject(response);
JSONArray result = jsonObject.getJSONArray("result");
Toast.makeText(MainActivity.this, result.toString(), Toast.LENGTH_LONG).show();
int i=result.length();
Log.i("Result Length", result.toString());
for(int j=0;j<i;j++){
storenamefinal.add(null);
imagelinksfinal.add(null);
}
String temp;
for(int j=0;j<i;j++)
{
JSONObject Data = result.getJSONObject(j);
Log.i("Data",Data.toString());
temp= (Data.getString("mainpriority"));
Log.i("temp", temp.toString());
storenamefinal.set(Integer.parseInt(temp) - 1, Data.getString("storename"));
Log.i("Result Length", storenamefinal.toString());
imagelinksfinal.add(R.drawable.ic_launcher);
}
Log.i("Result Length", storenamefinal.toString());
Toast.makeText(MainActivity.this,storenamefinal.get(0),Toast.LENGTH_LONG).show();
} catch (JSONException e) {
e.printStackTrace();
}
}
GridAdapterStores.java file
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
/**
* Created by mithilesh.izardar on 6/17/2016.
*/
public class GridAdapterStores extends BaseAdapter {
private Context context;
private ArrayList<String> storename=new ArrayList<String>();
private ArrayList<Integer> imagelinks=new ArrayList<Integer>();
public GridAdapterStores(Context c,ArrayList<String> storename, ArrayList<Integer> imagelinks) {
context = c;
this.imagelinks = imagelinks;
this.storename = storename;
}
#Override
public int getCount() {
return storename.size();
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
public View getView(int position, View convertView, ViewGroup parent){
View grid;
if (convertView == null) {
grid = new View(context);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
grid = inflater.inflate(R.layout.grid_stores,parent,false);
}
else {
grid = (View) convertView;
}
TextView textViewStoreName = (TextView) grid.findViewById(R.id.store_name);
ImageView imageViewStoreImage = (ImageView) grid.findViewById(R.id.store_image);
textViewStoreName.setText(storename.get(position));
// Integer x=imagelinks.get(position);
// imageViewStoreImage.setImageResource(x);
return grid;
}
Happy Coding :)
I receive a JSON array from the server that looks like this,
[{"id":"3","name":"Spanish 101","uid":"54f22e5c87cbd3.52439435","did":"fba6a04d1d6375fbdbb102953e984002"},
{"id":"4","name":"Calc","uid":"54f22e5c87cbd3.52439435","did":"fb7f4ba1eae22eb396dc7cbd465a10b4"},
{"id":"5","name":"Stats 250","uid":"54f22e5c87cbd3.52439435","did":"f6adca44250056c17fec56530faee7c9"}]
I want to take this information and put it into a listview
This is my code that is suppose to process this JSON aray and put it into a listview
package com.example.library;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.os.AsyncTask;
public class FetchDataTask extends AsyncTask<String, Void, String>{
private final FetchDataListener listener;
private String msg;
public FetchDataTask(FetchDataListener listener) {
this.listener = listener;
}
#Override
protected String doInBackground(String... params) {
if(params == null) return null;
// get url from params
String url = params[0];
try {
// create http connection
HttpClient client = new DefaultHttpClient();
HttpGet httpget = new HttpGet(url);
// connect
HttpResponse response = client.execute(httpget);
// get response
HttpEntity entity = response.getEntity();
if(entity == null) {
msg = "No response from server";
return null;
}
// get response content and convert it to json string
InputStream is = entity.getContent();
return streamToString(is);
}
catch(IOException e){
msg = "No Network Connection";
}
return null;
}
#Override
protected void onPostExecute(String sJson) {
if(sJson == null) {
if(listener != null) listener.onFetchFailure(msg);
return;
}
try {
// convert json string to json array
JSONArray aJson = new JSONArray(sJson);
// create apps list
List<Application> apps = new ArrayList<Application>();
for(int i=0; i<aJson.length(); i++) {
JSONObject json = aJson.getJSONObject(i);
Application app = new Application();
app.setTitle(json.getString("name"));
// add the app to apps list
apps.add(app);
}
//notify the activity that fetch data has been complete
if(listener != null) listener.onFetchComplete(apps);
} catch (JSONException e) {
msg = "Invalid response";
if(listener != null) listener.onFetchFailure(msg);
return;
}
}
/**
* This function will convert response stream into json string
* #param is respons string
* #return json string
* #throws IOException
*/
public String streamToString(final InputStream is) throws IOException{
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
}
catch (IOException e) {
throw e;
}
finally {
try {
is.close();
}
catch (IOException e) {
throw e;
}
}
return sb.toString();
}
}
FetchDataListener
package com.example.library;
import java.util.List;
public interface FetchDataListener {
public void onFetchComplete(List<Application> data);
public void onFetchFailure(String msg);
}
I am currently only trying to place the name into the listview, when I run this code what happens is only the first array gets put into the listview. So there is only one list item and it has the name Spanish 101.
Why aren't the other array names being put into the listview?
Application Adapter
package com.example.library;
import java.text.NumberFormat;
import java.util.List;
import android.content.Context;
import android.content.res.Resources;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.example.R;
public class ApplicationAdapter extends ArrayAdapter<Application>{
private List<Application> items;
public ApplicationAdapter(Context context, List<Application> items) {
super(context, R.layout.app_custom_list, items);
this.items = items;
}
#Override
public int getCount() {
return items.size();
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if(v == null) {
LayoutInflater li = LayoutInflater.from(getContext());
v = li.inflate(R.layout.app_custom_list, null);
}
Application app = items.get(position);
if(app != null) {
TextView titleText = (TextView)v.findViewById(R.id.titleTxt);
if(titleText != null) titleText.setText(app.getTitle());
}
return v;
}
}
Get and Set
package com.example.library;
public class Application {
private String title;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
MainActivity that has ListView
package com.example;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.ClipData;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.example.R;
import com.example.library.Application;
import com.example.library.ApplicationAdapter;
import com.example.library.DatabaseHandler;
import com.example.library.FetchDataListener;
import com.example.library.FetchDataTask;
import com.example.library.UserFunctions;
import java.util.HashMap;
import java.util.List;
public class MainActivity extends ListActivity implements FetchDataListener {
private ProgressDialog dialog;
ProgressDialog nDialog;
AlertDialog.Builder dlgAlert;
ListView listView ;
TextView tv;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
tv = (TextView) findViewById(R.id.tv);
nDialog = new ProgressDialog(MainActivity.this);
//Action bar information
android.app.ActionBar mActionBar = getActionBar();
assert mActionBar != null;
mActionBar.setDisplayShowHomeEnabled(false);
mActionBar.setDisplayShowTitleEnabled(false);
LayoutInflater mInflater = LayoutInflater.from(this);
View mCustomView = mInflater.inflate(R.layout.custom_actionbar, null);
//FIX THISSSSS TO LOGOUT BUTTON
RelativeLayout settingButton = (RelativeLayout) mCustomView
.findViewById(R.id.settingButton);
settingButton.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View view) {
UserFunctions logout = new UserFunctions();
logout.logoutUser(getApplicationContext());
Intent startup = new Intent(getApplicationContext(), StartUp.class);
startup.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(startup);
finish();
}
});
mActionBar.setCustomView(mCustomView);
mActionBar.setDisplayShowCustomEnabled(true);
//End action bar information
}//End onCreate
private void initView() {
// show progress dialog
DatabaseHandler db = new DatabaseHandler(getApplicationContext());
HashMap user = new HashMap();
user = db.getUserDetails();
String uid = user.get("unique_id").toString();
dialog = ProgressDialog.show(this, "", "Loading...");
String url = "www.example.com";
FetchDataTask task = new FetchDataTask(this);
task.execute(url);
}
#Override
public void onFetchComplete(List<Application> data) {
// dismiss the progress dialog
if(dialog != null) dialog.dismiss();
// create new adapter
ApplicationAdapter adapter = new ApplicationAdapter(this, data);
// set the adapter to list
setListAdapter(adapter);
}
#Override
public void onFetchFailure(String msg) {
// dismiss the progress dialog
if(dialog != null) dialog.dismiss();
// show failure message
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}
}//End Activity
This is how i deal with ListView and CustomAdapter
in onCreate() of Activity
//Photos Model List
photoList = new ArrayList<Photos>();
//ListView
lvGalleryPhotos = (ListView) parentView.findViewById(R.id.lvGalleryPhotos);
//My CustomAdapter
pgAdapter = new PhotoGalleryAdapter(photoList, getSherlockActivity());
//Setting adapter to GridView
lvGalleryPhotos.setAdapter(pgAdapter);
//Parsing JSON
for(int i=0;i<10;i++){
//each result contains details about a image
JSONObject result = results.getJSONObject(i);
//Real Parsing
int width = result.getInt("width");
int height = result.getInt("height");
String title = result.getString("titleNoFormatting");
String url = result.getString("unescapedUrl");
//Make it workable so replace \u003d with =
String tbUrl = result.getString("tbUrl").replace("\u003d", "=");
//Creating photo object and inserting all collected information into it.
Photos photo = new Photos();
photo.setHeight(height);
photo.setWidth(width);
photo.setTitle(title);
photo.setURL(url);
photo.setTbUrl(tbUrl);
//Adding each Photo Object to PhotoList
photoList.add(photo);
}
//Informing that data has changed
pgAdapter.notifyDataSetChanged();
My Custom Adapter
public class PhotoGalleryAdapter extends BaseAdapter {
ImageLoader mImageLoader;
List<Photos> photoList;
Context mContext;
BlowIt blw;
LayoutInflater mLInflater;
public PhotoGalleryAdapter(List<Photos> photoList,Context mContext){
this.photoList = photoList;
this.mContext = mContext;
blw = new BlowIt(mContext);
}
#Override
public int getCount() {
return photoList.size();
}
#Override
public Object getItem(int position) {
return photoList.get(position);
}
#Override
public long getItemId(int position) {
return position;
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
//Creating layout inflater
if(mLInflater==null){
mLInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
//Inflating Layout
if(convertView==null){
convertView = mLInflater.inflate(R.layout.gallery_single_photo,parent,false);
}
//Getting Object
final Photos photo = photoList.get(position);
//Single Image
NetworkImageView nivGalleryPhoto = (NetworkImageView) convertView.findViewById(R.id.nivGalleryPhoto);
TextView tvPhotoName = (TextView) convertView.findViewById(R.id.tvPhotoName);
TextView tvPhotoDesc = (TextView) convertView.findViewById(R.id.tvPhotoDesc);
final String photoDescr = photo.getHeight()+"x"+photo.getWidth();
nivGalleryPhoto.setImageUrl(photo.getTbUrl(), mImageLoader);
tvPhotoName.setText(photo.getTitle());
tvPhotoDesc.setText(photoDescr);
convertView.setTag(photo);
convertView.setId(position);
//This will trigger when ever the user clicks on a specific image
convertView.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
//This will prompt automatically context menu
v.showContextMenu();
}
});
return convertView;
}
}
and the layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#+id/llPhotosFragmentRoot"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="#+id/lvGalleryPhotos"
android:layout_height="wrap_content"
android:layout_width="match_parent"
></ListView>
</LinearLayout>
and the gallery_single_photo.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:padding="10dp"
android:layout_height="wrap_content" >
<!-- <com.android.volley.toolbox.NetworkImageView -->
<com.android.volley.toolbox.NetworkImageView
android:id="#+id/nivGalleryPhoto"
android:layout_height="90dp"
android:scaleType="centerCrop"
android:layout_width="75dp"
android:contentDescription="#string/dummy_desc"
/>
<TextView
android:id="#+id/tvPhotoName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:textStyle="bold"
android:layout_alignTop="#+id/nivGalleryPhoto"
android:layout_marginLeft="5dp"
android:layout_toRightOf="#+id/nivGalleryPhoto"
android:text="Large Text"/>
<TextView
android:id="#+id/tvPhotoDesc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="#+id/tvPhotoName"
android:layout_below="#+id/tvPhotoName"
android:text="Medium Text"
android:textSize="13sp"
android:textColor="#color/border_black" />
</RelativeLayout>
and all the above codes can make a listView with items like this
Use ViewHolder design pattern in your getView(...):
#Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
ViewHolder holder;
if(v == null) {
LayoutInflater li = LayoutInflater.from(getContext());
v = li.inflate(R.layout.app_custom_list, null);
holder = new ViewHolder();
holder.titleText = (TextView)v.findViewById(R.id.titleTxt);
v.setTag(holder);
}
else
holder = (ViewHolder) v.getTag()
Application app = items.get(position);
if(app != null) {
if(titleText != null)
holder.titleText.setText(app.getTitle());
}
return v;
}
static class ViewHolder {
TextView titleText;
}
I am working on an android application in which i have implemented CustomListView having some images and texts. i am feeding data in listview after a webservice call it takes some time to render list and when i scroll the list it's not scrolling smoothly.
here is the code of my List Adapter:
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;
import com.tv.makamaka.Constant;
import com.tv.makamaka.R;
import com.tv.makamaka.comment.SmileyCommentDialogActivity;
public class MakaMakaProfileListAdapter extends BaseAdapter implements Filterable {
private LayoutInflater mInflater;
private ArrayList<Object> itemList;
private Activity _activity;
String caption="";
String photoPath="";
String comments="";
String commentImage="";
String commentUserId="";
String likersImage="";
String likersType="";
String likersUserId="";
String mediaid="";
String mediaImageUrl="";
String mediaString="";
String mediaStringImage="";
String mediaStringUserId="";
String mediaType="";
String rating="";
String requestCount="";
String userid="";
String userProileImage="";
String withfriends="";
int index,index1,index2;
public MakaMakaProfileListAdapter(Activity activity, ArrayList<Object> itemList) {
this._activity = activity;
this.itemList = itemList;
mInflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getCount() {
return itemList.size();
}
public Object getItem(int position) {
return itemList.get(position);
}
public Filter getFilter() {
return null;
}
public long getItemId(int position) {
return 0;
}
static class ViewHolder {
TextView _commentTxt;
ImageView _userImage;
ImageView _smallUserImage;
ImageView _smallPostedUserImage;
ImageView _transparentImage;
}
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.makamaka_profile_listrow, null);
holder = new ViewHolder();
holder._userImage=(ImageView)convertView.findViewById(R.id.posted_userimage);
holder._smallUserImage=(ImageView)convertView.findViewById(R.id.small_userimage);
holder._smallPostedUserImage=(ImageView)convertView.findViewById(R.id.small_posted_userimage);
holder._transparentImage=(ImageView)convertView.findViewById(R.id.transparent_smiley_image);
holder._commentTxt = (TextView) convertView.findViewById(R.id.comment_txt);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder._commentTxt.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
}
});
holder._transparentImage.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent=new Intent(_activity,SmileyCommentDialogActivity.class);
_activity.startActivity(intent);
}
});
//////////////////SET VALUES ON LIST VIEW///////////////////////////
MakaMakaProfileBean makaMakaProfileBean=(MakaMakaProfileBean)itemList.get(position);
////////////////PARSE CAPTION///////////
caption=makaMakaProfileBean.getCaption();
ArrayList<String> captionList = new ArrayList<String>(Arrays.asList(caption.split(" , ")));
/*int index=caption.indexOf(",");
String caption1=caption.substring(0,index);
int index1=caption.indexOf(",", index+1);
String userName=caption.substring(index,index1+1);
String timeAgo=caption.substring(index1+1);*/
////////////////////////////////////////
////////////////PARSE COMMENTS////////////
comments=makaMakaProfileBean.getComments();
ArrayList<String> commentList = new ArrayList<String>(Arrays.asList(comments.split(" , ")));
//////////////////////////////////////////
////////////////PARSE COMMENT IMAGES//////
commentImage=makaMakaProfileBean.getCommentImage();
ArrayList<String> commentImageList = new ArrayList<String>(Arrays.asList(commentImage.split(" , ")));
//////////////////////////////////////////
////////////////PARSE COMMENT USER ID//////
commentUserId=makaMakaProfileBean.getCommentId();
ArrayList<String> commentUserIdList = new ArrayList<String>(Arrays.asList(commentUserId.split(" , ")));
//////////////////////////////////////////
////////////////PARSE LIKER IMAGES//////
likersImage=makaMakaProfileBean.getlikersImage();
ArrayList<String> likersImageList = new ArrayList<String>(Arrays.asList(likersImage.split(" , ")));
//////////////////////////////////////////
////////////////PARSE LIKER TYPE//////
likersType=makaMakaProfileBean.getComments();
ArrayList<String> likerTypeList = new ArrayList<String>(Arrays.asList(likersType.split(" , ")));
//////////////////////////////////////////
////////////////PARSE LIKER USER ID//////
likersUserId=makaMakaProfileBean.getComments();
ArrayList<String> likerUserIdList = new ArrayList<String>(Arrays.asList(likersUserId.split(" , ")));
//////////////////////////////////////////
////////////////PARSE OTHER PARAS//////
mediaid=makaMakaProfileBean.getmediaId();
mediaImageUrl=makaMakaProfileBean.getMediaImageUrl();
mediaString=makaMakaProfileBean.getMediaString();
mediaStringImage=makaMakaProfileBean.getMediaStringImage();
//mediaStringUserId=makaMakaProfileBean.
mediaType=makaMakaProfileBean.getMediaType();
rating=makaMakaProfileBean.getRating();
requestCount=makaMakaProfileBean.getRequestCount();
userid=makaMakaProfileBean.getUserId();
//userProileImage=makaMakaProfileBean.getUserProfileImage();
withfriends=makaMakaProfileBean.getWithFriends();
//////////////////////////////////////////
photoPath=makaMakaProfileBean.getUserProfileImage();
if(photoPath!=null){
URL url;
try {
url = new URL(photoPath);
Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
holder._userImage.setImageBitmap(bmp);
} catch (MalformedURLException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
int i=0;
while(i<captionList.size()){
if(i==0){
holder._commentTxt.setText((String)captionList.get(i));
}else if(i==1){
holder._commentTxt.setText(Html.fromHtml((String)captionList.get(i)));
}else if(i==2){
holder._commentTxt.setText(Html.fromHtml((String)captionList.get(i)));
}
i++;
}
return convertView;
/////////////////////////////////////////////////////////////////////
}
private Handler _handler = new Handler() {
public void dispatchMessage(Message msg) {
switch (msg.arg1) {
case 123:
break;
default:
break;
}
}
};
public void serverResponse(String response, int processid) {
Message msg = new Message();
msg.arg1 = processid;
msg.obj = response;
_handler.dispatchMessage(msg);
}
//SEND EMAIL TO INVITE FRIEND
public void sendEmail(String emailId){
Intent intent = new Intent(Intent.ACTION_SEND);
//intent.setType("text/plain");
intent.setType("message/rfc822");
intent.putExtra(Intent.EXTRA_EMAIL, emailId);
intent.putExtra(Intent.EXTRA_SUBJECT,Constant.EMAIL_SUBJECT);
intent.putExtra(Intent.EXTRA_TEXT, Constant.EMAIL_CONTENT);
_activity.startActivity(Intent.createChooser(intent, "Send Email"));
}
}
Output:
Is there any way to make list with smooth scroll.
You're decoding the image in getView. That's an expensive call, and you're going to be doing it a lot while scrolling. Use an LRUCache to cache images, so you can reuse the results of previous decodes if they exist. Only decode it in getView if its not in the cache.
I've searched and tried to implement different solutions to this problem but nothing has solved this issue. I have a custom listview class and when its called from my main activity the first time everything works as expected. Clicking on an item yield in moving to the next activity. However when I am in my new activity and call identical code for the OnItemClickListener it doesn't react to clicks. Any help in this would be great as I am stumped.
OCForumsAppActivity is my main activity, and then BothActivity is where my onItemClickListener isn't working.
OCForumsAppActivity.java:
package com.ocforums.application;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.htmlcleaner.TagNode;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;
import com.ocforums.application.R;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.widget.EditText;
public class OCForumsAppActivity extends Activity {
//private MyCustomAdapter mAdapter;
public String md5(String s) {
try {
// Create MD5 Hash
MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
digest.update(s.getBytes());
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexString = new StringBuffer();
for (int i=0; i<messageDigest.length; i++)
hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
public void loginfunc(String un,String pwd) {
try {
String pmd5sum = md5(pwd);
//HttpClient client = new DefaultHttpClient();
DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpget = new HttpGet("https://portal.sun.com/portal/dt");
HttpResponse response = client.execute(httpget);
HttpEntity entity = response.getEntity();
List<Cookie> cookies = client.getCookieStore().getCookies();
String postURL = "http://www.overclockers.com/forums/login.php?do=login";
HttpPost post = new HttpPost(postURL);
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("vb_login_username", un));
params.add(new BasicNameValuePair("vb_login_md5sumpassword", pmd5sum));
params.add(new BasicNameValuePair("cookieuser","1"));
UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params,HTTP.UTF_8);
post.setEntity(ent);
response = client.execute(post);
entity = response.getEntity();
cookies = client.getCookieStore().getCookies();
if (entity != null) {
Log.i("RESPONSE",EntityUtils.toString(entity));
}
client.getConnectionManager().shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
/* private class MyCustomAdapter extends BaseAdapter {
private ArrayList mData = new ArrayList();
private LayoutInflater mInflater;
public MyCustomAdapter() {
mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public void addItem(final List<List<String>> output2d) {
mData.add(output2d);
notifyDataSetChanged();
}
public int getCount() {
return mData.size();
}
public String getItem(int position) {
return (String) mData.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("getView " + position + " " + convertView);
ViewHolder holder = null;
if (convertView == null) {
convertView = mInflater.inflate(R.id.listView1, null);
holder = new ViewHolder();
holder.textView = (TextView)convertView.findViewById(R.id.listView1);
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
holder.textView.setText((CharSequence) mData.get(position));
return convertView;
}
}
public static class ViewHolder {
public TextView textView;
}*/
public static String gethurl()
{
return OCForumsAppActivity.hurl;
}
public static void sethurl(String newh)
{
OCForumsAppActivity.hurl = newh;
}
public static void sethreflist(List<String> newlist)
{
hrefslist = newlist;
}
CustomListView lv = new CustomListView();
public static String hurl;
private ProgressDialog pd;
static List<String> hrefslist;
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
pd = ProgressDialog.show(OCForumsAppActivity.this, "Working...", "request to server", true, false);
new ParseForums().execute("http://www.overclockers.com/forums/?styleid=23");
ListView list = (ListView)findViewById(R.id.listView1);
list.setOnItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Log.i("testing",hurl);
if(hurl.matches("(?i).*forumdisplay.*")){
Intent newActivity = new Intent(getBaseContext(), BothActivity.class);
startActivity(newActivity);
}
else if(hurl.matches("(?i).*showthread.php.*")) {
Intent newActivity = new Intent(getBaseContext(), ThreadActivity.class);
startActivity(newActivity);
}
else if(hrefslist == null){
Toast.makeText(getApplicationContext(), "Confused?", Toast.LENGTH_LONG).show();
//TODO add context menu for quote and reply
}
else{
Toast.makeText(getApplicationContext(), "Very Confused", Toast.LENGTH_LONG).show();
}
}
});
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.login:
final AlertDialog.Builder alert = new AlertDialog.Builder(this);
LinearLayout lila1= new LinearLayout(this);
lila1.setOrientation(1); //1 is for vertical orientation
final EditText usernametextbox = new EditText(this);
final EditText passwdtextbox = new EditText(this);
lila1.addView(usernametextbox);
lila1.addView(passwdtextbox);
alert.setView(lila1);
alert.setTitle("Login");
alert.setPositiveButton("Login", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
String uname = usernametextbox.getText().toString().trim();
String passwd = usernametextbox.getText().toString().trim();
loginfunc(uname,passwd);
}
});
alert.setNegativeButton("Cancel",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.cancel();
}
});
alert.show();
break;
case R.id.settings:
Toast.makeText(getApplicationContext(), "Perhaps one day...", Toast.LENGTH_SHORT).show();
break;
case R.id.UnansweredThreads:
hurl ="http://www.overclockers.com/forums/search.php?do=process&replyless=1&replylimit=0&exclude=78,124,37,167,186,186,187,21,144,18,179,150,181,182,183,11,164,95,151,123,27,28,29,30,31,32,142,170,33,36,67,62,63,65,11,19,200&nocache=0";
Intent newActivity = new Intent(getBaseContext(), ThreadActivity.class);
startActivity(newActivity);
break;
case R.id.MyPosts:
hurl = "http://www.overclockers.com/forums/search.php?do=getdaily&exclude=123&nocache=1";
Intent newActivity1 = new Intent(getBaseContext(), ThreadActivity.class);
startActivity(newActivity1);
break;
}
return true;
}
class ParseForums extends AsyncTask<String, Void, List<List<String>>> {
protected List<List<String>> doInBackground(String... arg) {
List<List<String>> combined2d = new ArrayList<List<String>>();
List<String> output = new ArrayList<String>();
List<String> hrefs = new ArrayList<String>();
try
{
HtmlHelper hh = new HtmlHelper(new URL(arg[0]));
List<TagNode> links = hh.getLinksByClass("forumtitle");
for (Iterator<TagNode> iterator = links.iterator(); iterator.hasNext();)
{
TagNode divElement = (TagNode) iterator.next();
output.add(divElement.getText().toString());
hrefs.add(divElement.getAttributeByName("href").toString());
}
combined2d.add(output);
combined2d.add(hrefs);
}
catch(Exception e)
{
e.printStackTrace();
}
return combined2d;
}
protected void onPostExecute(List<List<String>> output2d) {
pd.dismiss();
output2d.size();
Log.i("size",Integer.toString(output2d.get(0).size()));
Log.i("size",Integer.toString(output2d.get(1).size()));
ListView listview = (ListView) findViewById(R.id.listView1);
listview.setAdapter(lv.new MyCustomAdapter(OCForumsAppActivity.this, R.layout.row , output2d.get(0)));
hrefslist = output2d.get(1);
}
}
}
BothActivity.java:
package com.ocforums.application;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.htmlcleaner.TagNode;
import com.ocforums.application.CustomListView.MyCustomAdapter;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
public class BothActivity extends Activity{
List<String> foutput = new ArrayList<String>();
List<String> houtput = new ArrayList<String>();
CustomListView lv = new CustomListView();
String hurl;
List<String> hrefslist;
private ProgressDialog pd;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String qhurl = OCForumsAppActivity.gethurl();
String shurl = "http://www.overclockers.com/forums/"+qhurl+"&styleid=23";
pd = ProgressDialog.show(BothActivity.this, "Working...", "request to server", true, false);
new ParseBoth().execute(shurl);
Log.i("where ami?","back from execution");
ListView list = (ListView)findViewById(R.id.listView1);
list.setOnItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
hurl = hrefslist.get((int) id).replace("amp;","");
Toast.makeText(getApplicationContext(), hurl, Toast.LENGTH_LONG).show();
Log.i("testing",hurl);
if(hurl.matches("(?i).*forumdisplay.*")){
Toast.makeText(getApplicationContext(), hurl, Toast.LENGTH_LONG).show();
OCForumsAppActivity.sethurl(hurl);
BothActivity ba = new BothActivity();
ba.onCreate(null);
}
else if(hurl.matches("(?i).*showthread.php.*")) {
Intent newActivity = new Intent(getBaseContext(), ThreadActivity.class);
startActivity(newActivity);
}
else if(hrefslist == null){
Toast.makeText(getApplicationContext(), "Confused?", Toast.LENGTH_LONG).show();
//TODO add context menu for quote and reply
}
else{
Toast.makeText(getApplicationContext(), "Very Confused", Toast.LENGTH_LONG).show();
}
}
});
}
class ParseBoth extends AsyncTask<String, Void, List<List<String>>> {
protected List<List<String>> doInBackground(String... arg) {
List<List<String>> combined2d = new ArrayList<List<String>>();
List<String> output = new ArrayList<String>();
List<String> hrefs = new ArrayList<String>();
List<String> Toutput = new ArrayList<String>();
List<String> Threfs = new ArrayList<String>();
try
{
HtmlHelper hh = new HtmlHelper(new URL(arg[0]));
HtmlHelper hh2 = new HtmlHelper(new URL(arg[0]));
List<TagNode> links = hh.getLinksByClass("forumtitle");
List<TagNode> Tlinks = hh2.getLinksById("(?i).*thread.*");
for (Iterator<TagNode> iterator = links.iterator(); iterator.hasNext();)
{
TagNode divElement = (TagNode) iterator.next();
output.add(divElement.getText().toString());
hrefs.add(divElement.getAttributeByName("href").toString());
}
for (Iterator<TagNode> iterator = Tlinks.iterator(); iterator.hasNext();)
{
TagNode divElement = (TagNode) iterator.next();
Toutput.add(divElement.getText().toString());
Threfs.add(divElement.getAttributeByName("href").toString());
}
Log.i("size",Integer.toString(output.size()));
Log.i("size",Integer.toString(hrefs.size()));
Log.i("size",Integer.toString(Toutput.size()));
Log.i("size",Integer.toString(Threfs.size()));
combined2d.add(output);
combined2d.add(hrefs);
combined2d.add(Toutput);
combined2d.add(Threfs);
}
catch(Exception e)
{
e.printStackTrace();
}
return combined2d;
}
protected void onPostExecute(List<List<String>> output2d) {
pd.dismiss();
output2d.size();
foutput.addAll(output2d.get(0));
foutput.addAll(output2d.get(2));
houtput.addAll(output2d.get(1));
houtput.addAll(output2d.get(3));
Log.i("size",Integer.toString(foutput.size()));
setContentView(R.layout.main);
Log.i("where ami?","going");
ListView listview = (ListView) findViewById(R.id.listView1);
listview.setAdapter(lv.new MyCustomAdapter(getApplicationContext(), R.layout.row , foutput));
Log.i("where ami?","back");
hrefslist = houtput;
}
}
}
CustomListView.java:
package com.ocforums.application;
import java.util.List;
import android.app.Activity;
import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class CustomListView extends ListActivity {
List<String> lists;
Context fcontext;
public void makelistview(List<String> list, Context context){
lists=list;
setListAdapter(new MyCustomAdapter(context, R.layout.row, lists));
}
public void onCreate(Bundle savedInstanceState) {
//super.onCreate(savedInstanceState);
}
public class MyCustomAdapter extends ArrayAdapter<String> {
public MyCustomAdapter(Context context, int textViewResourceId,
List<String> objects) {
super(context, textViewResourceId, objects);
fcontext = context;
// TODO Auto-generated constructor stub
lists=objects;
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
TextView label=(TextView)row.findViewById(R.id.forumlist);
label.setText(lists.get(position));
ImageView icon=(ImageView)row.findViewById(R.id.icon);
if (lists.get(position).matches("AMD*")){
icon.setImageResource(R.drawable.forum_new);
}
else{
icon.setImageResource(R.drawable.forum_old);
}
return row;
}
}
}
row.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="#+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:contentDescription="OCForums thread icon"
android:src="#drawable/forum_new" />
<TextView
android:id="#+id/forumlist"
android:focusable="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView
android:id="#+id/listView1"
android:focusable="false"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
</ListView>
</LinearLayout>
Try changing
<ListView
android:id="#+id/listView1"
android:focusable="false"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
</ListView>
To this..
<ListView
android:id="#+id/listView1"
android:focusable="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
</ListView>
I have experienced this same problem before. You need to change the root node for your row.xml file to RelativeLayout instead of LinearLayout. I'm not 100% sure why this works, but it did so for me.
Of course, you will also have to add a tag saying:
android:layout_toRightOf="#+id/icon"
inside your TextView node.