2013-08-16 3 views
2

Я пытаюсь заполнить Grid View из ответа JSON, полученного от Async Task. Ниже файл активностьЗаполнение Gridview от ответа JSON

public class OpenTableActivity extends Activity implements AsyncResponse{ 

    String serUri, method; 
    OpenTableAdapter op; 
    WebServiceAsyncTask webTask = new WebServiceAsyncTask(this); 

    ArrayList<HashMap<String, String>> tableList = new ArrayList<HashMap<String, String>>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.open_table); 
     getTables(); 
     webTask.listener = this; 

     GridView gridview = (GridView) findViewById(R.id.grid); 
     gridview.setAdapter(new OpenTableAdapter(this,tableList)); 

     LinearLayout layout = (LinearLayout) findViewById(R.id.opentableLinear); 
     layout.setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View view, MotionEvent ev) { 
       hideKeyboard(view); 
       return false; 
      } 
     }); 



     Button btn = (Button) findViewById(R.id.table_home_btn); 
     btn.setOnClickListener(homeBtn); 
    } 

    public boolean getTables() { 

     serUri = "tables.json"; 

     method = "get"; 
     WebServiceAsyncTask webServiceTask = new WebServiceAsyncTask(OpenTableActivity.this); 
     webServiceTask.execute(serUri, method, this); 

     return true; 

    } 


    @Override 
    public void WriteJsonArray(JSONArray result) { 
     // TODO Auto-generated method stub 

     try { 

      for (int i = 0; i < result.length(); i++) { 
       JSONObject c = result.getJSONObject(i); 


       String tabLabel = c.getString("tablabel"); 
       String tabStatus = c.getString("tabstatus"); 

       HashMap<String, String> map = new HashMap<String, String>(); 


       map.put("table_name", tabLabel); 
       map.put("table_status", tabStatus); 

       tableList.add(map); 

      } 


     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 


    }} 

Класс адаптера для заполнения вида сетки, как показано ниже

public class OpenTableAdapter extends BaseAdapter { 
    private Context mContext; 
    String orderNumber; 
    OpenTableActivity openInstance; 
    String tableLabel; 
    String tableStatus; 
    LayoutInflater mInflater; 
    ArrayList<HashMap<String, String>> tablist = null; 

    public OpenTableAdapter(Context c, ArrayList<HashMap<String, String>> tablelist) { 
     // TODO Auto-generated constructor stub 

     mContext = c; 
     mInflater = LayoutInflater.from(c); 
     tablist = tablelist; 

    } 


    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     openInstance = new OpenTableActivity(); 
     return openInstance.tableList.size(); 
    } 

    @Override 
    public Object getItem(int arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public long getItemId(int arg0) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     ViewHolder holder; 
     if (convertView == null) { 

      convertView = mInflater.inflate(R.layout.button, 
        parent, false); 
      holder = new ViewHolder(); 
      holder.btn = (Button) convertView.findViewById(R.id.button); 
      convertView.setTag(holder); 

     } else { 

      holder = (ViewHolder) convertView.getTag(); 
     } 
     //Button btn = (Button) view.findViewById(R.id.button); 

     HashMap<String, String> map = tablist.get(position); 
      for (java.util.Map.Entry<String, String> mapEntry : map.entrySet()) { 
       String key = mapEntry.getKey(); 
       String value = mapEntry.getValue(); 

       holder.btn.setText(key); 


      return convertView; 


    } 



    static class ViewHolder 
     { 
     Button btn; 
     } 

} 

класса интерфейса определяется как ниже:

public interface AsyncResponse { 

    public void WriteJsonArray(JSONArray tableList); 

} 

Класс задачи Асинхронной как ниже

public class WebServiceAsyncTask extends AsyncTask<Object,Void,JSONArray> { 

    AsyncResponse listener; 
    public WebServiceAsyncTask(){} 
    public WebServiceAsyncTask(Context appcontext) 
    { 
     this.context=appcontext; 
     listener = (AsyncResponse) this.context; 
    } 
    String serviceUrl; 


    OpenTableActivity openInstance=new OpenTableActivity(); 
    CategoryActivity catAct; 
    private static JSONArray json = null; 
    private Context context = null; 
    private static JSONObject jsonObject = null; 
    protected JSONArray doInBackground(Object... params) { 
     // TODO Auto-generated method stub 

     serviceUrl = (String) params[0]; 
     String method = (String) params[1]; 

     final HTTPHelper httph = new HTTPHelper(serviceUrl,context); 

      json = httph.fetch();       


     return json; 
    } 


@Override 
protected void onPostExecute(JSONArray result) { // invoked on the ui thread 
    // TODO Auto-generated method stub 

    // dismiss progress dialog 
    // update ui here 


    super.onPostExecute(result); 

     if (listener != null){ 
      listener.WriteJsonArray(result); 
     } 


} 

При запуске этого процесса я получаю ошибку Stackoverflow, как только вызывается класс активности. Я попробовал много разных опций, но все равно такую ​​же ошибку. Не уверен, что я отсутствую, так как не могу отлаживать его, так как он дает ошибку даже до ввода класса активности. Пожалуйста, порекомендуйте. Благодарю.

+1

Посмотрите на StackOverflowException, определить метод, который вызывает рекурсию, устранить рекурсию. Пожалуйста, имейте в виду, что StackOverflow (этот сайт) не является вашим отладчиком. – allprog

+0

Я не знаю, почему вы используете OpenTableActivity openInstance = new OpenTableActivity(); как в вашем адаптере, так и в AsyncTask. Вы можете больше узнать о том, как использовать адаптер и асинтекс, прежде чем использовать их вот так! – hieuxit

+0

Это было сделано, когда я пробовал разные варианты, чтобы сделать эту работу. Спасибо, что указали это. Удалит его, как не требуется сейчас. @allprog: Я понимаю это, но я опубликовал его только после нескольких часов и все еще не повезло. – Gaurav

ответ

1

Решение для отправки. Из обсуждения

Вам необходимо переместить нижеследующее в WriteJsonArray. После того, как вы получите данные, которые вы должны пройти тот же классу адаптера

gridview.setAdapter(new OpenTableAdapter(this,tableList)); 

Замените ваш getCount на

@Override 
public int getCount() { 

return tablist.size(); 
} 

В GetView удалить ваш цикл

HashMap<String,String> map = tablist.get(position); 
String value = map.get("key"); 
// make sure the key i right. "key" here is only an example. replace with right key 
holder.btn.setText("value"); 

удалить этот

WebServiceAsyncTask webTask = new WebServiceAsyncTask(this); // at the beginnning 

удалить это из AsyncTask

OpenTableActivity openInstance=new OpenTableActivity(); 
0
AsyncTask<Void, Void, Boolean> waitForCompletion = new AsyncTask<Void, Void, Boolean>() { 

     @Override 
     protected void onPreExecute() { 
      // TODO Auto-generated method stub 
      super.onPreExecute(); 
      dialog.setVisibility(View.VISIBLE); 
     } 

     @Override 
     protected Boolean doInBackground(Void... params) { 

     } 

       @Override 
     protected void onPostExecute(Boolean result) { 
        } 
    } 
+0

, вы уверены, что ответили на правильный вопрос ?? – Raghunandan

+0

он работает правильно в моем проекте в Onpreexection(), используя как диалоговое окно загрузки ... onbackground() получает все ваши данные из json ... и onpostexecution() отклоняет диалоговое окно загрузки или задает вам данные или что-то, что вы хотите сделать следующий... он будет работать правильно ... –

+0

Я так не думаю. есть другие ошибки в вопросе ops, которые следует исправить. этот ответ не помогает вообще. проверьте это обсуждение между мной и оператором, теперь вы сами начнете – Raghunandan

Смежные вопросы