0

データベースからいくつかのレコードを読み取り、それらを にロードしていListViewます。ListView構成CheckBoxTextView. _ ロードは で行われAsyncTaskます。アプリケーションのこの部分は正常に動作します。

次のステップは、データベースからのいくつかのフラグに従っていくつかのチェックボックスを自動的にチェックすることですが、ここで問題が発生します。内部のアイテムをチェックしようとするonPostExecute()と、エラーが発生しNullPointerExceptionます。たとえば、setOnClickListener()ボタンウィジェットから同じことを行うと、正常に動作します。

ListView問題は、入力されているかどうか、チェックボックスがTextView読み込まれて画面に表示されているかどうかを確認する方法です。

プログラムが壊れるコードの部分が次のようになるのに役立つかどうかはわかりません。

        for (j=0; j<3; j++)
    {
        LinearLayout itemLayout = (LinearLayout)listView.getChildAt(j); // Find by under LinearLayout
        CheckBox checkbox = (CheckBox)itemLayout.findViewById(R.id.ColChk);

        for (k=0; k<rbmjere.size(); k++)
        {
            if (checkbox.getTag().toString() == rbmjere.get(k).toString())
            {
                checkbox.setChecked(true);

            }
        }   
    }

その行で壊れます:

LinearLayout itemLayout = (LinearLayout)listView.getChildAt(j);

これは、ボックスを自動チェックするためのコードを実行するボタンを手動で押した場合にのみ機能し、これはすべてのデータがロードされた場合にのみ機能することに注意してください。


これが私のコードです:

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

    listView = (ListView)findViewById(R.id.listView1);

    btnPohrani = (Button)findViewById(R.id.btnPohrani);

    btnProvjeri = (Button)findViewById(R.id.btnProvjeri);

    btnProvjeri.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            new loadSPCKontrole().execute("FCN");
        }
    });
MyArrList = new ArrayList<HashMap<String, String>>();

public void fillData()
{                       
    SimpleAdapter listadapter = new SimpleAdapter(this, MyArrList, R.layout.activity_list_row,

    new String[] {"OpisMjere", "RbMjere"}, new int[] {R.id.ColOpis, R.id.ColCode});

    listView = (ListView)findViewById(R.id.listView1);
    listView.setAdapter(listadapter);       
}

private class loadSPCKontrole extends AsyncTask<String, Void, Void>
{                   

    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(SPCUpdate.this);
        pDialog.setMessage("Loading in progress ...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

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

        HashMap<String, String> map;

        String k = params[0].toString();
        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        nameValuePairs.add(new BasicNameValuePair("sIDKategorija", k));

        try
        {                       
                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost("http://192.168.16.48" + "/spc/get_spcmjere.php");
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                is = entity.getContent();
        }
        catch(Exception e)
        {
                 Log.e("log_tag", "Error in http connection "+ e.toString());
        }

        try
        {
               BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"),8);
               sb = new StringBuilder();
               sb.append(reader.readLine() + "\n");

               String line="0";
               while ((line = reader.readLine()) != null) {
                              sb.append(line + "\n");
                }
                is.close();
                result=sb.toString();

        }
        catch(Exception e)
        {
            Log.e("log_tag", "Error converting result " + e.toString());
        }

        int ct_id;
        String ct_name;

        try
        {

              jArray = new JSONArray(result);
              JSONObject json_data=null;
              for(int i=0;i<jArray.length();i++){
                     json_data = jArray.getJSONObject(i);
                     ct_id=json_data.getInt("RbMjere");
                     ct_name=json_data.getString("OpisMjere");

                     map = new HashMap<String, String>();
                     map.put("RbMjere", String.valueOf(ct_id));
                     map.put("OpisMjere", ct_name);

                     MyArrList.add(map);
                 }                    

         }
        catch(JSONException e1)
        {
            Log.e("Greška konvertiranja", e1.toString());
        } 
        catch (ParseException e1) 
        {
            e1.printStackTrace();
        }

        return null;
    }

    protected void onPostExecute(Void result)
    {
        super.onPostExecute(result);

        fillData();

        listView.setAdapter(new SPCMjereAdapter(SPCUpdate.this));

        pDialog.dismiss();

    }
}

   public class SPCMjereAdapter extends BaseAdapter 
    {
        private Context context;

        public SPCMjereAdapter(Context c) 
        {           
            context = c;                    
        }

        public int getCount() {
            return MyArrList.size();
        }

        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

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

            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            if (convertView == null) {
                convertView = inflater.inflate(R.layout.activity_list_row, null); 

            }

            // ColID
            TextView txtOpis = (TextView) convertView.findViewById(R.id.ColOpis); 
            txtOpis.setText(MyArrList.get(position).get("OpisMjere") +".");

            // ColCode
            TextView txtRbMjere = (TextView) convertView.findViewById(R.id.ColCode);
            txtRbMjere.setText(MyArrList.get(position).get("RbMjere"));


            // ColChk               
            CheckBox Chk = (CheckBox) convertView.findViewById(R.id.ColChk);
            Chk.setTag(MyArrList.get(position).get("RbMjere"));

            return convertView;

        }

    }

そして、チェックする必要があるアイテムを取得するコードは次のとおりです。

DB objDB = new DB();
    ArrayList<Integer> rbmjere = objDB.getCheckedSPC(ID);

    int k=0;
    int j=0;
    for (j=0; j<MyArrList.size(); j++)
    {

        LinearLayout itemLayout = (LinearLayout)listView.getChildAt(j); // Find by under LinearLayout
        CheckBox checkbox = (CheckBox)itemLayout.findViewById(R.id.ColChk);

        for (k=0; k<rbmjere.size(); k++)
        {
            if (checkbox.getTag().toString() == rbmjere.get(k).toString())
            {
                checkbox.setChecked(true);
            }
        }   
    }

上記のコードは、リストビューにアイテムが入力されている場合、およびこのコードが OnClickListener() の下にある場合にのみ機能しますが、リストビューのすべての行が読み込まれていないように見えるため、onPostExecute から実行すると機能しません。だから私の質問は、すべての行のロードが終了したときに情報を取得し、その後、データベースから取得したデータに従ってどの項目をチェックする必要があるかを確認するにはどうすればよいですか?

4

3 に答える 3

1

ビューのリサイクルのため、listView.getChildAt() は、複数ではなく、表示されている位置のビューのみを返します。

この他の質問はこちらで確認できます。それはあなたが探している答えを持っています: ListView getChildAt 表示されている子に対して null を返す

于 2013-07-25T12:59:01.603 に答える
1

In your case I think that piece of code should be inside your adapter's getView implementation.

Here you go with examples on

And how to use them with your List.

于 2013-07-25T13:00:08.727 に答える
0

まず、データセット内のアイテム数を読み取ることで、リストがいつロードされるかがわかります。リストビューのデータセットがそれと等しい場合、すべてのデータがリストビューにロードされます..残念ながら、これ以上お手伝いすることはできませんここにデータロードコードが表示されないため、これで..

次に、次のように変更する必要があります。

for (j=0; j<3; j++)

int listChildSize = listView.getChildCount();
for (j = 0; j < listChildSize ; j++)

編集

jfs は正しいです。追加する必要があります。

if (checkbox.getTag().toString() == rbmjere.get(k).toString())
            {
                checkbox.setChecked(true);

            }

カスタム アダプタ内。 カスタム アダプターと ViewHolder パターンのサンプルを次に示します

于 2013-07-25T13:01:09.503 に答える