I have a listview which displays items retrieved from the webpage. Each item in the listview has a facebook share button which allows the user to share the information. However when I click on the share button, the information displayed is different from the item I clicked. And the no matter which item I click, it will be getting information of the first few item.
For example, clicking on item #6 would display info of item #2. In other words, no matter which item I click, it will be displaying wrong information. Am I doing anything wrong here?
**The listview displays items correctly flawlessly.
MyActivity.java
public class MyActivity extends Activity {
private static final String targetURL ="http://www.google.com/image/myself";
ListView list;
private Handler mRunOnUi = new Handler();
private ProgressDialog mProgress;
ProgressDialog dialog;
private String[] mStrings = {};
private String[] dStrings = {};
private String date;
private String messageToPost;
Facebook facebook = new Facebook("110928043842377");
private SharedPreferences mPrefs;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.cats);
new TheTask().execute();
list=(ListView)findViewById(R.id.list);
}
protected class TheTask extends AsyncTask<Void, Void, MyResultClass >{
protected void onPreExecute() {
dialog = ProgressDialog.show(MyActivity.this, "Retrieving Information", "Please wait for a few seconds...", true, false);
dialog.setCancelable(true);
}
protected MyResultClass doInBackground(Void... params) {
searchContent();
MyResultClass result = new MyResultClass();
result.mStrings = mStrings;
result.dStrings = dStrings;
result.date = date;
return result;
}
protected void onPostExecute(MyResultClass result) {
dStrings = result.dStrings;
mStrings = result.mStrings;
date = result.date;
LazyAdapter adapter = new LazyAdapter(MyActivity.this, mStrings, dStrings);
list.setAdapter(adapter);
adapter.setTaskListener(new FBookTaskListener(){
public void doAuthentication()
{
// here all your FB authentication related stuff.
mPrefs = getPreferences(MODE_PRIVATE);
String access_token = mPrefs.getString("access_token", null);
long expires = mPrefs.getLong("access_expires", 0);
if(access_token != null) {
facebook.setAccessToken(access_token);
}
if(expires != 0) {
facebook.setAccessExpires(expires);
}
/*
* Only call authorize if the access_token has expired.
*/
if(!facebook.isSessionValid()) {
facebook.authorize(Myactivity.this, new String[] { "publish_stream", "read_stream", "publish_checkins"}, new DialogListener() {
@Override
public void onComplete(Bundle values)
{
SharedPreferences.Editor editor = mPrefs.edit();
editor.putString("access_token", facebook.getAccessToken());
editor.putLong("access_expires", facebook.getAccessExpires());
editor.commit();
}
@Override
public void onFacebookError(FacebookError error) {}
@Override
public void onError(DialogError e) {}
@Override
public void onCancel() {}
});
}
Log.d("Test", "Authorizing completed");
}
public void postToWall(String data)
{
Log.d("Test", "Start of postToWall");
postToFacebook(messageToPost);
System.out.println("postToWall complete");
}
});
dialog.dismiss();
}
}
class MyResultClass
{
public String[] mStrings;
public String[] dStrings;
public String date;
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
facebook.authorizeCallback(requestCode, resultCode, data);
}
private void postToFacebook(String message) {
Bundle params = new Bundle();
params.putString("name", "Pinky");
params.putString("caption", "google.com");
params.putString("link", "http://www.google.com");
params.putString("description", "Visit ");
params.putString("picture", data);
facebook.dialog(this, "feed", params, new PostDialogListener());
}//close posttofacebook
private final class WallPostListener extends BaseRequestListener {
public void onComplete(final String response) {
mRunOnUi.post(new Runnable() {
@Override
public void run() {
mProgress.cancel();
Toast.makeText(MyActivity.this, "Posted to Facebook", Toast.LENGTH_SHORT).show();
}
});
}//close oncomplete
}//close wallpostlistener
public void searchContent()
{
String imageC = "";
String textC = "";
try {
URL url = new URL(targetURL);
// Make the connection
URLConnection conn = url.openConnection();
BufferedReader reader = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line = reader.readLine();
Pattern sChar = Pattern.compile("&.*?;");
line.replaceAll("\\<.*?\\>", "");
Matcher msChar = sChar.matcher(line);
while (msChar.find()) line = msChar.replaceAll("");
while (line != null) {
if(line.contains("../../"))
{
int startIndex = line.indexOf("../../") + 6;
int endIndex = line.indexOf(">", startIndex + 1);
String abc = "http://www.google.com/image/myself";
String imageSrc = line.substring(startIndex,endIndex);
//complete full url
String xyz = abc +imageSrc;
xyz = xyz.substring(0,xyz.indexOf('"'));
xyz = xyz +";";
xyz = xyz.replaceAll(" ", "%20");
imageC += xyz;
mStrings = imageC.split(";");
line = reader.readLine();
}
if(line.contains("../../") == false)
{
line = reader.readLine();
}
if (line.contains("Gnametag"))
{
int startIndex = line.indexOf("Gnametag") + 10;
int endIndex = line.indexOf("<", startIndex + 1);
String gname = line.substring(startIndex,endIndex);
textC = textC.replaceAll("</span>", "");
textC += "Name: "+gname+ "\n";
}
if (line.contains("Age"))
{
textC += "Age: "+reader.readLine() + "\n" + ";";
textC = textC.replaceAll(" ", "");
dStrings = textC.split(";");
}
if (line.contains("Last Update"))
{
int startIndex = line.indexOf("Last Update") + 16;
int endIndex = line.indexOf("</td>", startIndex + 1);
date = line.substring(startIndex,endIndex);
reader.close();
}
}
// Close the reader
reader.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public class PostDialogListener extends BaseDialogListener {
@Override
public void onComplete(Bundle values) {
final String postId = values.getString("post_id");
if (postId != null) {
} else {
}
}
}
}
Adapter.java
public class LazyAdapter extends BaseAdapter {
FBookTaskListener taskListener;
Facebook facebook = new Facebook("110928043842377");
private Activity activity;
private String[] data;
private String[] text;
private static LayoutInflater inflater=null;
public ImageLoader imageLoader;
private ProgressDialog mProgress;
private Handler mRunOnUi = new Handler();
String FILENAME = "AndroidSSO_data";
private SharedPreferences mPrefs;
public void setTaskListener(FBookTaskListener listener)
{
this.taskListener = listener;
}
public LazyAdapter(Activity a, String[] d, String[] t) {
activity = a;
data=d;
text = t;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
imageLoader=new ImageLoader(activity.getApplicationContext());
}
public int getCount() {
return data.length;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public static class ViewHolder{
public TextView text;
public ImageView image;
}
public View getView(final int position, View convertView, ViewGroup parent) {
View vi=convertView;
ViewHolder holder;
if(convertView==null){
vi = inflater.inflate(R.layout.item, null);
holder=new ViewHolder();
holder.text=(TextView)vi.findViewById(R.id.text);;
holder.image=(ImageView)vi.findViewById(R.id.image);
vi.setTag(holder);
ImageButton fbBtn = (ImageButton) vi.findViewById(R.id.fb);
fbBtn.setOnClickListener(
new Button.OnClickListener() {
public void onClick(View v)
{
taskListener.doAuthentication();
taskListener.postToWall();}}
);
}
else
holder=(ViewHolder)vi.getTag();
holder.text.setText(text[position]);
holder.image.setTag(data[position]);
imageLoader.DisplayImage(data[position], activity, holder.image);
return vi;
}//close getView
public static interface FBookTaskListener{
public void doAuthentication(); //paramas may be added if needed
public void postToWall(String data); //paramas may be added if needed
}
}
The problem here is.. in ListView.. the getView() is called each time you single row of the List is generated.
Lets say your screen can show 4 items(1-4) at a time(with rest in scroll). When you scroll down..items 2-5 would be visible and getView() is called again for row5.
What it is troubling here in your case is, your onclick listener which belongs to say 5th item. wil be assigned to row2-5 on screen.. I solved similar problem in my case using view.setTag() in Adapter and in single onclick listener, i retrieved the tag of the view. and perform my onclick task as per the row(identified by tag object).
Follow this approach you will be able to solve the task then.. If any further doubt..post it with some details like - i m havin lil trouble identifying how your onclick listener is working..like how are you distinguishing the ROWS in/for the onclick event.. what actually those rows are ..
Let check two below method, it is strange:
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
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