안드로이드 listview 질문드립니다.

조회수 974회

이미지

ListView listView = findViewById(R.id.listview);
    SingerAdapter adapter = new SingerAdapter();

    adapter.addItem(new SingerItem("1","2"));
    adapter.addItem(new SingerItem("1","2"));
    adapter.addItem(new SingerItem("1","2"));

    listView.setAdapter(adapter);

    Button button = findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(getApplicationContext(), secondActivity.class);
            ArrayList<SingerItem> items = new ArrayList<SingerItem>();
            intent.putExtra("items", items);
            startActivity(intent);
        }
    })

메인액티비티에서 보내고 난 후 받는쪽 어댑터에서 어떻게 처리해야 될지 모르겠어서 질문드립니다.

public class secondAdapter extends BaseAdapter {
    ArrayList<SingerItem> items = (ArrayList<SingerItem>) intent.getSerializableExtra("items");

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

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        SingerItemView view = new SingerItemView(getApplicationContext());

        SingerItem item = items.get(position);
        view.setTitle(item.getTitle());
        view.setMainText(item.getMaintext());

        return view;
    }
}
  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 문의하시려는 내용이 정확히 무엇인가요? 알 수 없는 사용자 2018.7.12 16:43
  • 메인액티비티에서 보내고 난 후 받는쪽 어댑터에서 어떻게 처리해야 될지 모르겠어서 질문드립니다. 알 수 없는 사용자 2018.7.13 16:24
  • 어떤걸 어떻게 처리해야 되는 것에 대해 모르겠다고 하시는지 명확하게 적어주셔야 할것 같은데요 ㅜㅜ secondActivity 호출 한 다음에 리스트뷰를 구성해야 하는데 Adapter 를 어떻게 구현해야 되는지 잘 모르겠다는 말씀이신가요? 알 수 없는 사용자 2018.7.13 17:04
  • 네 맞습니다 ㅠㅠ 여러번 답변드리게 해서 죄송합니다.. 알 수 없는 사용자 2018.7.14 07:19

1 답변

  • secondActivity 에서 intent.getSerializable() 을 통해 List 를 전달 받은 후 부터 설명 드리겠습니다.

    ListView 구성

    final SingerAdapter adapter = new SingerAdapter(dataSet);
    final ListView listView = findViewById(R.id.listView);
    listView.setAdapter(adapter);
    

    Adapter 객체를 생성하여 ListView 에 setAdapter() 를 호출 합니다.

    Adapter 구성

    static class SingerAdapter extends BaseAdapter {
    
            final List<SingerItem> dataSet;
    
            SingerAdapter(List<SingerItem> dataSet) {
                this.dataSet = dataSet;
            }
    
            @Override
            public int getCount() {
                return dataSet.size();
            }
    
            @Override
            public SingerItem getItem(int position) {
                return dataSet.get(position);
            }
    
            @Override
            public long getItemId(int position) {
                return 0;
            }
    
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                ViewHolder holder;
                if (convertView == null) {
                    convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row, null);
                    holder = new ViewHolder();
                    holder.title = convertView.findViewById(R.id.title);
                    holder.mainText = convertView.findViewById(R.id.mainText);
                    convertView.setTag(holder);
                } else {
                    holder = (ViewHolder) convertView.getTag();
                }
                holder.title.setText(getItem(position).getTitle());
                holder.mainText.setText(getItem(position).getMainText());
                return convertView;
            }
    
            static class ViewHolder {
                TextView title;
                TextView mainText;
            }
    }
    

    SingerAdapter 생성자에서 ListView 에 바인딩 될 dataset 를 매개변수로 하여 받습니다. ListView 에서 중요한 부분은 getView() 인데, ListView 의 row 를 구성하는 view 가 항상 새롭게 생성 되어 쓰이지 않고 재활용 해서 사용하기 위해 holder 패턴을 사용하여 구현합니다. getView() 가 호출 될떄마다 매번 view 를 생성하는 것은 메모리에도 영향을 줄 뿐 아니라 findViewById() 또한 퍼포먼스에 있어서 매번 호출 하는 것은 좋지 않습니다.

    ListView 는 위와 같이 사용하시면 될것 같구요. ListView 보다 개선 된 버전이라 할수있는 RecyclerView 를 사용하시면 더 좋습니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)