2012-03-08 9 views
2

私はウェブページから取得したアイテムを表示するリストビューを持っています。リストビューの各項目にはfacebook共有ボタンがあり、ユーザーは情報を共有できます。しかし、共有ボタンをクリックすると、表示される情報はクリックしたアイテムとは異なります。そして、どのアイテムをクリックしても、最初の数アイテムの情報が得られます。Android - リストビュー内のアイテムから不正なデータを取得しました

たとえば、項目#6をクリックすると、項目#2の情報が表示されます。言い換えれば、どのアイテムをクリックしても、間違った情報が表示されます。私はここで何か悪いことをしていますか?

**リストビューは、項目を正しく表示します。

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 
} 

} 
+0

どこがリスナーですか?ここでそれを見ることができません。あなたは** onItemSelectedListener **を使用している必要があります。どこでも、そのコードを投稿してください。 – ngesh

+0

私のFacebookのボタンは、アダプタクラスにあります。 'fbBtn.setOnClickListener'を使用しています – Hend

答えて

5

ここでの問題は、リストビューに.. ..ですgetViewメソッド( )は、Listの単一の行が生成されるたびに呼び出されます。

あなたの画面は一度に4つの項目(1〜4)を表示できます(スクロールして休んでください)。下にスクロールすると、項目2-5が表示され、rowView5に対してgetView()が再度呼び出されます。

ここであなたの問題を悩ましているのは、5番目の項目に属するあなたのonclickリスナーです。私は私の場合は、アダプタでview.setTag()を使用して同様の問題を解決し、単一のonclickリスナーで、私はビューのタグを取得しました。 (タグオブジェクトによって識別される)行ごとにonclickタスクを実行します。

このアプローチに従えば、タスクを解決することができます。さらに疑問が生じたら、あなたのonclickリスナーがどのように動作しているかを識別する、im havin lilのトラブルROWS in/onclickイベントのために実際にそれらの行が何であるか..

+0

私はすでに 'view.setTag(holder)'をアダプタに持っているとします。だから、アダプタのonClickイベントに 'v.getTag()'という行を追加する必要がありますか? – Hend

+0

異なる行はここに対応しています...?あなたのコードから、それぞれの行の各画像ボタンに対して、FB認証と壁への投稿が呼び出されています。 –

+0

リスナーの行を識別するために、 ...を持っている必要があります... 'taskListener.doAuthentication(vi);'メソッド内でv.getTag()を取得することによって行を識別できる 'doAuthentication(View v)'として呼び出しを変更します... –

1

方法下記の2を確認してみましょう、それは奇妙です:

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

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

私はそれについてはわかりませんが、少なくともリストビュー項目を正しく表示しています。 – Hend

関連する問題