0

サーバーから受信した JSON からグリッド ビューを作成しようとしています。次に、取得した結果から gridview を設定する必要があります。以下は、グリッド ビューを設定するためのアクティビティ ファイルです。

public class OpenTableActivity extends Activity {

    String serUri, method;
    OpenTableAdapter op;

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

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.open_table);

        LinearLayout layout = (LinearLayout) findViewById(R.id.opentableLinear);
        layout.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent ev) {
                hideKeyboard(view);
                return false;
            }
        });
        getTables();
            GridView gridview = (GridView) findViewById(R.id.grid);
        gridview.setAdapter(new OpenTableAdapter(this));
        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;

    }

    public void WriteJsonArray(final JSONArray result, Context contextInstance) {


        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;
    //ArrayList<HashMap<String, String>> tablist = null;

    public OpenTableAdapter(Context c) {
        // TODO Auto-generated constructor stub
        mContext = 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) {
        View view = null;
        if (convertView == null) {
            LayoutInflater li = (LayoutInflater) mContext
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = li.inflate(R.layout.button, null);
        } else {
            view = convertView;
        }
        Button btn = (Button) view.findViewById(R.id.button);
        openInstance = new OpenTableActivity();

        for (HashMap<String, String> map : openInstance.tableList)
            for (java.util.Map.Entry<String, String> mapEntry : map.entrySet()) {
                String key = mapEntry.getKey();
                String value = mapEntry.getValue();
                btn.setText(key);

テーブルリストは WriteJSONArray に正しく取り込まれます。次に、制御は からアダプタ クラスに移動し gridview.setAdapter(new OpenTableAdapter(this));ます。しかし、そこでは何も実行しません。実際の流れを見るためにブレークポイントを置いたのですが、以下のメソッドしか来ず、その後は何も実行されません。トレースにエラーはなく、何も実行されていません。

public OpenTableAdapter(Context c) {
    // TODO Auto-generated constructor stub
    mContext = c;

}

これは、非同期タスクの「Post Execute」メソッドから渡されたときに渡されたコンテキストが正しくないためだと思います。コンテキストを渡してみましたが、それでも同じ問題です。お知らせ下さい。ありがとう。

4

2 に答える 2

0

初期化していませんGridView

GridView gridView = (GridView) findViewById(R.id.gridview);

投稿を編集し、gridview が初期化されていると言うので、それは問題ではありません。

BaseAdapter クラスのコンストラクターで mInflater を初期化します。また、ハッシュマップをコンストラクターに渡し、同じものを getview で使用します。

getView であなたがしていることopenInstance = new OpenTableActivity()は間違っています。を呼び出してアクティビティを開始できますstartActivity

   LayoutInflater mInflater;  
   public OpenTableAdapter(Context c) {
    mContext = c;
    mInflater = LayoutInflater.from(c); 
    tablist = tablelist;
    }

あなたのgetView

         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(); 
            } 

// use tablelist data to set the text to button using the position as index      

                 HashMap<String, String>> map = tablist.get(position)
                 // use the map to set the text to the button now. 
                    holder.btn.setText(key);
            return convertView; 
    }

ビューホルダーを使用します。http://developer.android.com/training/improving-layouts/smooth-scrolling.html

   static class ViewHolder
   {
     Button btn;
   } 
于 2013-08-16T04:41:20.067 に答える
0

交換

gridview.setAdapter(new OpenTableAdapter(this));

 gridview.setAdapter(new OpenTableAdapter(OpenTableActivity.this));
于 2013-08-16T04:53:13.557 に答える