1

以下は、現在 listView に使用しているコードです。

private class Asyncprojectlist extends AsyncTask<Void, Void, Void>{
        JSONArray JSar;
        JSONObject JSob;
        String project_title, project_sector;
        @Override
        protected void onPreExecute() {
            progressDialog =  new ProgressDialog(Allprojects.this);
            progressDialog.setCancelable(false);
            progressDialog.setMessage("Loading...");
            progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
            progressDialog.setProgress(0);
            progressDialog.show();
        }

        @Override
        protected Void doInBackground(Void... params) {
            UserFunctions user = new UserFunctions();
            JSob = user.allprojects();
            try {
                JSar = JSob.getJSONArray("data");

            } catch (JSONException e1) {
                e1.printStackTrace();
            }
            for(int i=0; i<JSar.length(); i++){
                try {
                    JSONObject newobj = JSar.getJSONObject(i);
                    project_title = newobj.getString("title");
                    project_sector = newobj.getString("sector");

                    HashMap<String, String> single = new HashMap<String, String>();
                    single.put("title", project_title);
                    single.put("sector", project_sector);

                    all_list.add(single);

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

            }
//          Log.i("json object", JSar.toString());
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            ListAdapter adapter = new SimpleAdapter(getApplicationContext(), all_list, R.layout.projectlist_frame, 
                    new String[]{"title","sector"}, new int[]{R.id.projecttitle, R.id.projectsector});
            setListAdapter(adapter);
            progressDialog.dismiss();
            list = getListView();
            list.setOnItemClickListener(new AdapterView.OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> parent, View viewClicked,
                        int position, long id) {

                    Intent toindividual = new Intent(Allprojects.this, Individual_project.class);
                    try {
                        toindividual.putExtra("nid", JSar.getJSONObject(position).getString("id"));
                        startActivity(toindividual);

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

}

all_listここでは、データをフェッチするために API が呼び出されており、レイアウト上でやなどの値を割り当てるためにAPIArrayList<HashMap<>>が使用されています。ここのすべてが完璧に機能します。しかし、リストビューのレイアウトにあるリスナーを実装するのに苦労しています。カスタムアダプターが必要だと思います。カスタム アダプターを作成しようとしても、動作するコードを思いつくことができませんでした。listView に checkBox を実装できるように、カスタム アダプタの実装を手伝ってください。SimpleAdapterprojectTitleprojectStatuslistViewcheckBoxCheckChangeListener

4

2 に答える 2

8

そのためのカスタム アダプタを作成できます。このアダプターでは、inメソッドで設定CheckChangeListenerする必要があります。checkboxgetView

public class MyBaseAdapter extends BaseAdapter {

    private Context mContext;
    private LayoutInflater mInflater;

    public MyBaseAdapter(Context context) {

        this.mContext = context;
        mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        if (convertView == null) {
            holder = new ViewHolder();
            convertView = mInflater.inflate(R.layout.row_layout, null);

            holder.txtName = (TextView) convertView.findViewById(R.id.textView1);
            holder.chkTick = (CheckBox) convertView.findViewById(R.id.checkBox1);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        final int pos = position;
        holder.txtName.setText("ABC");
        holder.chkTick.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked) {
                    Toast.makeText(mContext, "Checked", Toast.LENGTH_SHORT).show(); 
                }
            }
        });

        return convertView;
    }
}

詳細については、このlink1link2も確認してください。

カスタムアダプターにhashMapを使用し、次のように値を設定できUIます

public class HashMapAdapter extends BaseAdapter {

    private HashMap<String, String> mData = new HashMap<String, String>();
    private String[] mKeys;
    public HashMapAdapter(HashMap<String, String> data){
        mData  = data;
        mKeys = mData.keySet().toArray(new String[data.size()]);
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public Object getItem(int position) {
        return mData.get(mKeys[position]);
    }

    @Override
    public long getItemId(int arg0) {
        return arg0;
    }

    @Override
    public View getView(int pos, View convertView, ViewGroup parent) {
        String key = mKeys[pos];
        String Value = getItem(pos).toString();

        //do your view stuff here

        return convertView;
    }
}
于 2013-08-19T08:25:20.750 に答える