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

BaseAdapter getView함수가 앱 최초실행시 한번만 실행되고 그 이후 실행이 안됩니다...

0 추천

MainActivity에서 TabLayout의 선택된 Tab에 따라 해당 Fragment화면을 보여주는데요

Amart.java 파일에서 ListView로 아이템들 리스트를 보여주려 합니다.

앱 최초 실행시에는 원하는데로 리스트들이 나타나는데 다른 Tab을 선택하고 다시 A마트 Tab으로 오면 리스트가 안보입니다. 

디버그옵션으로 실행해보니 앱 최초실행시에는 제대로 동작하다가 다른 Tab을 선택하고 다시 돌아오면 아이템들이 추가는 되는데 getView함수가 호출이 안됩니다.

폰에서 앱을 백그라운드에서도 종료시키고 다시 실행하면 다시 리스트들이 제대로 보입니다. 그리고 다시 다른 Tab으로 이동후 다시 돌아오면 아무것도 안보입니다.

오류가 발생하는것도 아니고 앱이 중지되거나 하는것도 아닙니다. 다른기능들은 정상작동합니다.

도와주세요ㅜㅜ 아래 코드 추가합니다.


아래 MainActivity의 Tab의 리스너에서 선택된 Tab의 Fragment로 이동합니다.

public class MainActivity extends AppCompatActivity {

    Toolbar mToolbar;

    DrawerLayout mDrawerLayout;



    Amart amartMain;

    Bmart bmartMain;

    Cmart cmartMain;



    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);



        amartMain = new Amart();

        bmartMain = new Bmart();

        cmartMain = new Cmart();



        TabLayout tabs = (TabLayout)findViewById(R.id.tabs);

        tabs.addTab(tabs.newTab().setText("A 마트"));

        tabs.addTab(tabs.newTab().setText("B 마트"));

        tabs.addTab(tabs.newTab().setText("C 마트"));

        tabs.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {

           public void onTabSelected(TabLayout.Tab tab) {

               int position = tab.getPosition();

               Log.d("MainActivity", "선택된 탭: " + position);



               Fragment selected = null;

               if(position == 0) {

                   selected = amartMain;

               }else if(position == 1) {

                   selected = bmartMain;

               }else if(position == 2) {

                   selected = cmartMain;

               }



               getSupportFragmentManager().beginTransaction().replace(R.id.container, selected).commit();

           }



            public void onTabUnselected(TabLayout.Tab tab) {

            }



            public void onTabReselected(TabLayout.Tab tab) {

            }

        });

    }

 

 

A마트 Tab선택시 보여지는 Fragment를 상속받은 Amart.java입니다.

DB에서 값을 받아오고 해당 데이터를 adapter의 addItem함수를 호출해 아이템을 추가해 줍니다.

DB에서 값을 받아오는부분은 너무 길어서 빼고 올립니다.데이터를 받아오는부분은 Log찍어서 확인결과 정상적으로 다 받아오므로 그부분 오류는 아닌듯합니다.
 

public class Amart extends Fragment {

    ListView mListView_A;

    ListViewAdapter adapter_A;



                adapter_A.addItem(drawable, name, norprice, curprice, rate);



}

 


리스트뷰아이템 클래스입니다.

public class ListViewItem {

    private Drawable iconDrawable;

    //private Bitmap bitmap;

    private String pName;

    private String norPrice;

    private String curPrice;

    private String disRate;



    public void setIcon(Drawable icon) {

        iconDrawable = icon;

    }





    public void setPName(String pname) {

        pName = pname;

    }



    public void setNorPrice(String norprice) {

        norPrice = norprice;

    }



    public void setCurPrice(String curprice) {

        curPrice = curprice;

    }



    public void setDisRate(String disrate) {

        disRate = disrate;

    }



    public Drawable getIcon() {

        return this.iconDrawable;

    }



    public String getPName() {

        return this.pName;

    }



    public String getNorPrice() {

        return this.norPrice;

    }



    public String getCurPrice() {

        return this.curPrice;

    }



    public String getDisRate() {

        return this.disRate;

    }



}

 

 

 

 

 

리스트뷰 어댑터 클래스입니다.

public class ListViewAdapter extends BaseAdapter {

    ArrayList<ListViewItem> listViewItemList = new ArrayList<ListViewItem>();

    ListViewItem listViewItem;



    public int getCount() {

        return listViewItemList.size();

    }



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

        final int pos = position;

        final Context context = parent.getContext();





        if (convertView == null) {

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

            convertView = inflater.inflate(R.layout.a_mart_list, parent, false);

        }





        ImageView pImgView = (ImageView) convertView.findViewById(R.id.listImg_Amart);

        TextView pNameTextView = (TextView) convertView.findViewById(R.id.listPName_Amart);

        TextView nPriceTextView = (TextView) convertView.findViewById(R.id.listNPrice_Amart);

        TextView cPriceTextView = (TextView) convertView.findViewById(R.id.listCPrice_Amart);

        TextView disRateTextView = (TextView) convertView.findViewById(R.id.listRate_Amart);





        listViewItem = listViewItemList.get(position);





        pImgView.setImageDrawable(listViewItem.getIcon());

        pNameTextView.setText(listViewItem.getPName());

        nPriceTextView.setText(listViewItem.getNorPrice());

        cPriceTextView.setText(listViewItem.getCurPrice());

        disRateTextView.setText(listViewItem.getDisRate());



        return convertView;

    }



    public long getItemId(int position) {

        return position;

    }



    public Object getItem(int position) {

        return listViewItemList.get(position);

    }



    public void addItem(Drawable icon, String pName, String norPrice, String curPrice, String disRate) {

        ListViewItem item = new ListViewItem();

        Log.i("cccccccc:", pName);

        item.setIcon(icon);

        item.setPName(pName);

        item.setNorPrice(norPrice);

        item.setCurPrice(curPrice);

        item.setDisRate(disRate);

        listViewItemList.add(item);

        Log.e("listViewItemList: ", listViewItemList.toString());

    }

}

 

익명사용자 님이 2016년 11월 22일 질문

1개의 답변

0 추천
아이템을 다 입력하신뒤 adapter_A.notifyDataSetChanged()라는 메소드 호출해주면 됩니다.

메소드 이름은 맞는지 모르겠네요;;
익명사용자 님이 2016년 11월 22일 답변
감사합니다. 모든아이템추가 완료 시점에 한줄 추가했더니 몇일 고생하던게 한번에 해결됐네요...
...