마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

php 내 db data값을 안드로이드 상에 뿌려줄 때 문제가 있습니다.

0 추천

mysql에 저장해놓은 data를 php를 통해 json 형식으로 encoding하여 그 값을 안드로이드에 가공하여 보여주는 작업을 하고 있습니다.

안드로이드 상에는 viewpager를 통해 원하는 각각의 page를 fragment로 구성하여 보여주고 있습니다.

listview 방식으로 (어댑터 사용) string값을 textview로 보여주고, 이미지를 picasso 라이브러리를 통해 보여주고 있습니다.

여기서 문제는 php문의 json값을 안드로이드 상에는 잘 받아오는데 각 fragment listview상에 뿌려줄 때는 그 값들이 보여질 때도 있고, 안보여질때도 있고 들쑥날쑥하다는 겁니다.

되어야 할 것 같은데 안나와 답답한데 뭐가문제인지 모르겠습니다. ㅠㅠ
고수님들의 도움이 절실합니다!!

이미지를 못 불러왔을 때이미지를 불러왔을 때

코드 일부 입니다

 

원조호리 (120 포인트) 님이 2017년 3월 8일 질문
public class first_plant extends Fragment {

    //public Context context;
    String JSON_STRING;
    ArrayList<nonbat> data = new ArrayList<>();

    public first_plant()
    {

    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getJSON();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View view = inflater.inflate(R.layout.test_jsonparsing_display_listview, container, false);
        Context context = view.getContext();
        ListView listView = (ListView) view.findViewById(R.id.listview);
        plantAdapter adapter = new plantAdapter(context, data);
        listView.setAdapter(adapter);

        return view;
    }

    public void getJSON(){
        new BackgroudTask().execute();
    }

    class BackgroudTask extends AsyncTask<Void,Void,String>
    {
        String json_url;

        @Override
        protected void onPreExecute() {
            json_url = "http://52.78.162.29/nonbat_json_return.php";
        }

        @Override
        protected String doInBackground(Void... params) {
            try{
                URL url = new URL(json_url);
                HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
                InputStream inputStream = httpURLConnection.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                StringBuilder stringBuilder = new StringBuilder();
                while((JSON_STRING = bufferedReader.readLine()) != null){
                    stringBuilder.append(JSON_STRING+"\n");
                }

                bufferedReader.close();
                inputStream.close();
                httpURLConnection.disconnect();

                return stringBuilder.toString().trim();

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }

        @Override
        protected void onPostExecute(String result) {
            JSON_STRING = result;
            parseJSON();
        }
    }

    private static class plantAdapter extends BaseAdapter {
        private ArrayList<nonbat> mData;
        String passid, passname, passengname;
        String passdesc, passtype, passgoodliving, passothername, passflower, passharvest, passuse, passdeco;
        String imgURL;
        private Context context;

        public plantAdapter(Context context, ArrayList<nonbat> data) {
            this.context = context;
            mData = data;
        }

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

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

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

        //한 칸에 대한 처리 -> view holder를 만들어야 함
        //convertView에 ListView의 각 한칸한칸의 내용이 들어오게 됨
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;

            if(convertView == null){
                holder = new ViewHolder();

                convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_plant, parent, false);
                //ImageView image = (ImageView) convertView.findViewById(R.id.image_view);
                CircularImageView cirImg = (CircularImageView) convertView.findViewById(R.id.img_view);
                TextView name = (TextView) convertView.findViewById(R.id.name);
                TextView engName = (TextView) convertView.findViewById(R.id.engname);
                TextView type = (TextView) convertView.findViewById(R.id.type);
                Button btn = (Button) convertView.findViewById(R.id.btn);

                //holder.image = image;
                holder.image = cirImg;
                holder.name = name;
                holder.engName = engName;
                holder.type = type;
                holder.btn = btn;

                holder.btn.setTag(position);
                convertView.setTag(holder);
            }
            else{
                // 재사용
                holder = (ViewHolder) convertView.getTag();
            }

            // 데이터 셋팅 (in position)
            nonbat plant = mData.get(position);
            passid = plant.getId();
            passname = plant.getName();
            passengname = plant.getEngname();
            passdesc = plant.getDesc();
            passtype = plant.getType();
            passgoodliving = plant.getGoodliving();
            passothername = plant.getOthername();
            passflower = plant.getFlower();
            passharvest = plant.getHarvest();
            passuse = plant.getUse();
            passdeco = plant.getDeco();
            imgURL = plant.getUrl();

            Picasso.with(context).load(imgURL).fit().into(holder.image);
            holder.name.setText(plant.getName());
            holder.engName.setText(plant.getEngname());
            holder.type.setText(plant.getType());
            holder.btn.setOnClickListener(new View.OnClickListener(){

                @Override
                public void onClick(View v) {
                    int pos = (Integer)v.getTag();
                    System.out.println("position num: " + pos);

                    Intent intent = new Intent(context, nonbat_detail_activity.class);
            
                }
            });

            return convertView;
        }

        static class ViewHolder {
            ImageView image;
            TextView name, engName, type;
            Button btn;
        }
    }

}
일부 코드 내용입니다(json 파싱 부분은 생략했습니다...8000자;;)

2개의 답변

0 추천

plantAdapter에 setData 할 수 있는 부분이 없네요.

setData메소드 넣어주세요.

지금소스대로면 data값이 널이라 안나와야 정상인데 혹시 파싱메소드부분에서 새로 어댑터를 생성하고 있는지요?

익명사용자 님이 2017년 3월 9일 답변
0 추천

parseJson 하고..

 

Array에 넣으셨을건데..

plantAdapter.notifyDatasetChanged 하셨나요?

익명사용자 님이 2017년 3월 9일 답변
혹시 plantAdapter.notifyDatasetChanged 를 넣어야 하는 위치가 어디쯤이면 될지 알 수 있을까요?
...