【问题标题】:How to send ArrayList into BaseAdapter Android如何将 ArrayList 发送到 BaseAdapter Android
【发布时间】:2013-03-26 00:18:12
【问题描述】:

我想在它之前将我的 JSON 显示到 gridview 中。我将我的 JSON 显示到 ListView 中,它可以工作。但是在 BaseAdapter 中,我不知道如何将我放入 ArrayList 的 JSON 发送到 Base Adapter

这是我的源代码:

活动:

    public class MainActivity extends ListActivity {
    List AgenList = new ArrayList();
        boolean boolStatusKoneksi=true;
        private ProgressDialog Dialog;
        protected Context applicationContext;
        @Override
        public void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);     
            setContentView(R.layout.activity_main);
            new AgenAsyncTask().execute();
            GridView gridview = (GridView) findViewById(R.id.gridview);
            gridview.setAdapter(new AgenAdapter(this));
        }


    public class AgenAsyncTask extends AsyncTask<String, String, String>
    {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Dialog = new ProgressDialog(MainActivity.this);
            Dialog.setMessage("Mohon Tunggu sebentar...");
            Dialog.setIndeterminate(false);
            Dialog.setCancelable(true);
            Dialog.show();
        }


        protected String doInBackground(String... args) {

                 String url = ("http:10.10.2/selectAgent.htm");

                  try{
                      JSONParser j=new JSONParser();
                        JSONArray jsonArray = j.takeJson(url);;

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


                            HashMap<String, String> map = new HashMap<String, String>();
                            if (c.has("atasan")) 
                                map.put("atasan", c.get("atasan").toString());
                            if (c.has("nama_agen")) 
                                map.put("nama_agen", c.get("nama_agen").toString());
                            if (c.has("kode_agen")) 
                                map.put("kode_agen", c.get("kode_agen").toString());
                            if (c.has("no_aaji")) 
                                map.put("no_aaji", c.get("no_aaji").toString());
                            if (c.has("jenis")) 
                                map.put("jenis", c.get("jenis").toString());
                              AgenList.add(map);
                         }
                    } catch (JSONException e) {
                        e.printStackTrace();
                        }
                  return null;
                    }


        @Override
        protected void onPostExecute(String file_url) {

       }
   }

这是我的 BaseAdapter:

    public class AgenAdapter extends BaseAdapter {

        public AgenAdapter(MainActivity mainActivity) {

        }

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

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

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

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater layout = getLayoutInflater();
            View view= layout.inflate(R.layout.list_item,parent,false);

            TextView ATASAN = (TextView) findViewById(R.id.atasan);
            TextView NAMA_AGEN= (TextView) findViewById(R.id.nama_agen);
            TextView KODE_AGEN= (TextView) findViewById(R.id.kode_agen);
            TextView NO_AAJI= (TextView) findViewById(R.id.no_aaji);
            TextView JENIS= (TextView) findViewById(R.id.jenis);
            return view;
        }
    }
}

如您所见,我将 ArrayList 命名为 = AgenList,但我没有将它放入我的 BaseAdapter。

【问题讨论】:

  • 你解决了吗?

标签: java android json arraylist baseadapter


【解决方案1】:

看看ArrayAdapter。它包含基于ArrayList 的适配器的所有实现。

  1. 使您的适配器成为ArrayAdapter 的子类,并提供参数化类型。在这种情况下,您是 Map&lt;String, String&gt;

    public class ResultAdapter extends ArrayAdapter<Map<String,String>> {
    
        private int mResource;
    
        /**
        * @param context
        * @param resource
        */
        public ResultAdapter(Context context, int resource, ArrayList<Map<String,String>> dataList) {
            super(context, resource, dataList);
            this.mResource = resource;
        }
    
        ...
    
    }
    
  2. 重写 ArrayAdapter 的 getView 方法,用于设置给视图的数据。

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view;
        // If the view is already inflated, reuse it.
        // Else inflate the view
        if (convertView != null) {
            view = convertView;
        } else {
            //inflate view
            final LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(mResource, parent, false);
        }
    
        TextView ATASAN = (TextView) findViewById(R.id.atasan);
        ...
    
    
        //Get data here
        Map<String, String> item = getItem(position);
    
        //Set data to the View's e.g.
        ATASAN.setText(item.get("ATASAN"));
        ...
    
        return view;
    }
    

【讨论】:

    【解决方案2】:

    创建一个参数化的构造函数并将你的数组列表传递给它的参数。所以你的班级会是这样的

    public class AgenAdapter extends BaseAdapter {
    List<yourObj> list;
    Activity a;
        public AgenAdapter(Activity activity,List<yourObj> list) {
           this.a=activity;
           this.list=list;
    
        }
    
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return list.size();///////return size of list
        }
    
        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return position;///// dont return null here
        }
    
        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;/////////return position as itemID
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater layout = getLayoutInflater();
            View view= layout.inflate(R.layout.list_item,parent,false);
    
            TextView ATASAN = (TextView) findViewById(R.id.atasan);
            TextView NAMA_AGEN= (TextView) findViewById(R.id.nama_agen);
            TextView KODE_AGEN= (TextView) findViewById(R.id.kode_agen);
            TextView NO_AAJI= (TextView) findViewById(R.id.no_aaji);
            TextView JENIS= (TextView) findViewById(R.id.jenis);
            return view;
        }
    }
    

    【讨论】:

    • 它不起作用我需要的只是如何放置包含我的 JsonArray 的数组列表
    • 如果您想将任何数据发送到您的适配器,您将不得不使用相同的技术,使用您的适配器类的参数化构造函数发送您的数据,如果是 JSONArray,您的方法将类似于:JSONArray列表;活动一; public AgenAdapter(Activity 活动,JSONArray 列表) { this.a=activity;这个.list=列表; }
    • 做了一些更改,请参见上面的代码并查找其中添加的 cmets
    • 还是强制关闭,log cat 是这么说的 你的内容必须有一个 id 属性为 'android.R.id.list' 的 ListView
    • 因为你用ListActivity 扩展你的类而不是Activity,你必须在你的布局xml 文件中有一个ListView,ID 为@android:id/list。扩展ListActivity 表示这个活动,主要是一个列表,但旁边可能有一些组件。因此,当您假设一个活动最初是一个列表时,您应该在该活动的布局 xml 文件中指定一个列表,即主列表。该列表应该有 ID,@android:id/list。因此,只需将活动的ListView 的 id 字段设置为@android:id/list
    【解决方案3】:

    试试这个。

    gridview.setAdapter(new AgenAdapter(this), AgenList);
    

    并在你的 onPostExecute() 中使用这一行而不是 onCreate()

    像这样:

        @Override
        protected void onPostExecute(String file_url) {
         gridview.setAdapter(new AgenAdapter(this), AgenList);
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多