如何在网格视图中添加"下一步"功能?



我已经制作了一个gridview,我试图在该网格中添加下一个功能。当有人点击"下一步"时,网格就会加载一堆新的图像。

我已经做了一个逻辑,不知何故它是工作的,但它是不稳定的。应用程序有时会停止,有时点击"下一步"下一页被跳过(假设目前我在第0页,当我点击"下一步"网格得到刷新,第2页显示,而不是第1页)

我正在做的是我做了一个asynctask,它发送http请求到php服务器的图像的新url。然后刷新gridview并显示来自新图像url的新图像。

public class UserPage extends Activity {

ImageAdapter ia = new ImageAdapter(this);
GetResponse task = new GetResponse(0);
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.userpage);
    final GridView gridview = (GridView) findViewById(R.id.gridview);
    gridview.setAdapter(ia);
    gridview.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);
    Button nxt = (Button) findViewById(R.id.nextbuttongrid);
    nxt.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            // next page
            int i = Integer.parseInt(GetResponse.counter);
            i=i+1;
            GetResponse.counter = Integer.toString(i);
            String x = GetResponse.response;
            task.execute();
        //this is done so that the thread sleeps until the response variable value is updated  
            while(x.equals(GetResponse.response)==true){
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    System.out.println("Here in sleep..incre");
                } }
            change(gridview);
        }
    });
    Button pre = (Button) findViewById(R.id.previousbuttongrid);
    pre.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            // previous page
            int i = Integer.parseInt(GetResponse.counter);
            i=i-1;
            GetResponse.counter = Integer.toString(i);
            String x = GetResponse.response;
            task.execute();
           //this is done so that the thread sleeps until the response variable value is updated  
            while(x.equals(GetResponse.response)==true){
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                System.out.println("Here in sleep.. decre");
            } }
            change(gridview);
        }
    });
    /**
     * On Click event for Single Gridview Item
     * */
     gridview.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View v,
                int position, long id) {
            // Sending image id to FullImage.java
            Intent i = new Intent(getApplicationContext(), FullImage.class);
            i.putExtra("id", position);
            startActivity(i);
        }
    });
}
void change(GridView gridview) {
    ia = new ImageAdapter(this);
    gridview.invalidateViews();
    gridview.setAdapter(ia);
}
}
public class GetResponse extends AsyncTask<Void, Void, Void> {
  public static String counter = "0";
  HttpPost httppost;
  StringBuffer buffer;
  HttpResponse response1;
  HttpClient httpclient;
  List<NameValuePair> nameValuePairs;
  public static String response;

    @Override
    protected Void doInBackground(Void... params) {
try {
    Log.d("response's Value == >", "Response previous " + response);
    httpclient=new DefaultHttpClient();
    httppost= new HttpPost(ServerAdressHere); 
    //add your data
    nameValuePairs = new ArrayList<NameValuePair>(3);
    nameValuePairs.add(new BasicNameValuePair("username",AndroidPHPConnectionDemo.userName)); 
    nameValuePairs.add(new BasicNameValuePair("password",AndroidPHPConnectionDemo.passWord));
    nameValuePairs.add(new BasicNameValuePair("count",counter));
    Log.d("Counter's Value == >", "Counter " + counter);
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    //Execute HTTP Post Request
    response1=httpclient.execute(httppost);
    ResponseHandler<String> responseHandler = new BasicResponseHandler();
    response = httpclient.execute(httppost, responseHandler);
    Log.d("response's Value == >", "Response after " + response);
}
    catch(Exception e){
        System.out.println("Exception Here"+e);
    }
  return null;
    }
   }
public class ImageAdapter extends BaseAdapter {
private Context mContext;
private TextView txtUrl;
private String response;
public ImageView imageView;
public static String[] mThumbIds;
  public ImageAdapter(Context c) {
    mContext = c;
    this.response = GetResponse.response.trim();
    mThumbIds = response.split(",");
    }
private final Downloader imageDownloader = new Downloader(mContext);

public int getCount() {
    return mThumbIds.length;
}
public Object getItem(int position) {
    return mThumbIds[position];
}
public long getItemId(int position) {
    return mThumbIds[position].hashCode();
}
// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
    if(convertView==null) {
        imageView = new ImageView(mContext);
        imageView.setLayoutParams(new GridView.LayoutParams(LayoutParams.MATCH_PARENT, 195));
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setPadding(10, 10, 10, 10);
    }
    else {
         imageView = (ImageView) convertView;
         }
    imageDownloader.DisplayImage(mThumbIds[position], (ImageView) imageView);
    return imageView;
}
public Downloader getImageDownloader() {
    return imageDownloader;
}
}

"counter"变量(静态和字符串类型)在请求中发送,它告诉php服务器下一个gridview的页码。因此,服务器将发送与该页码绑定的图像url。

我面临的问题是,网格得到刷新之前"响应"变量是由asynctask类更新。所以这就是为什么我使用System.sleep()来获得两行代码执行的时间间隔。

"response"变量(静态和整型)包含图像的url。

请帮忙!如果需要更多细节,请询问。

首先,线程。onClick方法中的sleep in循环不是一种正确的方法。异步任务的重点是避免锁定主线程和线程。睡眠就是这样做的。

使用asynctask的onPostExecute来代替。

然而,这显然工作到目前为止(你的服务器和连接是足够快,否则你会有一个ANR),即使你的ui可能冻结几秒钟。

之后,就是图片下载的问题了。调用setAdapter(new Adapter…)似乎是一个足够好的方法。

一步一步调试你做了多少?

  • 您是否收到Log.d("response's Value == >", "Response after " + response);行的图像id列表?
  • 你到达getView,如果是这样你得到正确的url/id/字符串,无论应该是在mThumbIds[位置]?
  • 如果是,什么是下载程序,它是如何工作的?

出于好奇,为什么要执行两次请求?(response1=httpclient.execute(httppost);)

编辑

我真不敢相信你没有,尽管提到你的应用程序实际上崩溃了,这很有趣,这与"网格没有得到刷新"是完全不同的。

A/read你的堆栈跟踪。

B/如果不清楚,谷歌一下。

C/我不知道还有什么可以添加到(a task can be executed only once)

最新更新