gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:23:04 25 4
gpt4 key购买 nike

我有一个 ListView ,它显示从网页检索到的项目。 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
}

}

最佳答案

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

假设您的屏幕一次可以显示 4 个项目 (1-4)(其余部分在滚动中)。当您向下滚动时,项目 2-5 将可见,并且会再次为第 5 行调用 getView()。

在您的案例中,令人不安的是,您的 onclick 监听器属于第 5 项。将被分配到屏幕上的第 2-5 行。我在 Adapter 中使用 view.setTag() 解决了类似的问题,在单个 onclick 监听器中,我检索了 View 的标签。并根据行(由标记对象标识)执行我的 onclick 任务。

按照这种方法,您将能够解决任务。如果还有疑问,请将其发布并附上一些详细信息,例如 - 我在确定您的 onclick 监听器的工作方式方面遇到了麻烦。例如,您如何区分 ROWS在/对于 onclick 事件..这些行实际上是什么..

关于Android - 从 ListView 中的项目检索到的数据不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9612666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com