Android - 从listview中的项目检索的数据不正确

时间:2012-03-08 03:56:03

标签: android facebook listview

我有一个列表视图,显示从网页检索的项目。列表视图中的每个项目都有一个facebook共享按钮,允许用户共享信息。但是,当我单击共享按钮时,显示的信息与我单击的项目不同。而且无论我点击哪一项,它都会获得前几项的信息。

例如,单击项目#6将显示项目#2的信息。换句话说,无论我点击哪个项目,都会显示错误的信息。我在这里做错了吗?

** listview正确显示项目。

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
}

}

2 个答案:

答案 0 :(得分:5)

这里的问题是..在ListView ..每次生成List的单行时都会调用getView()。

让我们说你的屏幕一次可以显示4个项目(1-4)(在滚动中休息)。向下滚动时,将显示2-5项,并为row5再次调用getView()。

在你的情况下,令人不安的是,你的onclick听众属于第五项。将被分配到屏幕上的第2-5行..我在我的情况下使用适配器中的view.setTag()和单个onclick侦听器解决了类似的问题,我检索了视图的标记。并根据行(由标记对象标识)执行我的onclick任务。

按照这种方法,你将能够解决任务然后..如果有任何进一步的疑问...提供一些细节,如:我很难找出你的onclick听众是如何工作的......就像你如何区分ROWS in / for onclick事件..实际上那些行是什么..

答案 1 :(得分:1)

让我们检查以下两种方法,很奇怪:

public Object getItem(int position) {
    return position;
}

public long getItemId(int position) {
    return position;
}