익스펜더블 리스트뷰에서 웹뷰띄우기 질문입니다

조회수 3260회

안드로이드 스튜디오에서 익스펜더블 리스트뷰를 만들어서 해당 Child리스트를 클릭시 관련 토스트를 띄우는거까지하는 코드입니다.

여기다 토스트를 띄우면서 동시에 각각의 child리스트에 다른 url을 입력하여, 해당된 웹뷰들을 띄우게하고싶은데, 어떻게 해야할까요?

이미지

MainActivity.java

package com.example.myexpandable;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.HashMap;

public class MainActivity extends AppCompatActivity {

    ExpandableListView listMain;

    private ArrayList<String> arrayGroup = new ArrayList<String>();
    private HashMap<String,ArrayList<String>> arrayChild = new HashMap<String, ArrayList<String>>();

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

        listMain = (ExpandableListView) this.findViewById(R.id.expandableListView1);
        setArrayDate();
        listMain.setAdapter(new AdptMain(this, arrayGroup, arrayChild));


        listMain.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
                String menu = arrayChild.get( arrayGroup.get(groupPosition)).get(childPosition);
                Toast.makeText(getApplicationContext(), menu+"홈페이지로 이동합니다~", Toast.LENGTH_SHORT).show();
                return false;
            }
        });

    }

    private void setArrayDate() {
        arrayGroup.add("햄버거 매장");
        arrayGroup.add("피자 매장");
        arrayGroup.add("중국집");

        ArrayList<String> arrayHamberger = new ArrayList<String>();
        arrayHamberger.add("맥도날드");
        arrayHamberger.add("버거킹");
        arrayHamberger.add("롯데리아");

        ArrayList<String> arrayPizza = new ArrayList<String>();
        arrayPizza.add("피자헛");
        arrayPizza.add("피자스쿨");
        arrayPizza.add("미스터피자");
        arrayPizza.add("피자에땅");
        arrayPizza.add("피자알볼로");

        ArrayList<String> arrayChinese = new ArrayList<String>();
        arrayChinese.add("청마루");
        arrayChinese.add("차이차이");
        arrayChinese.add("홍콩반점");

        arrayChild.put(arrayGroup.get(0), arrayHamberger);
        arrayChild.put(arrayGroup.get(1), arrayPizza);
        arrayChild.put(arrayGroup.get(2), arrayChinese);
    }

}


AdptMain.java

package com.example.myexpandable;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.RelativeLayout;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;

public class AdptMain extends BaseExpandableListAdapter {
    private Context context;
    private ArrayList<String> arrayGroup;
    private HashMap<String, ArrayList<String>> arrayChild;

    public AdptMain( Context context, ArrayList<String> arrayGroup, HashMap<String, ArrayList<String>> arrayChild){
        super();
        this.context = context;
        this.arrayChild= arrayChild;
        this.arrayGroup= arrayGroup;


    }



    @Override
    public int getGroupCount() {
        return arrayGroup.size();
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return arrayChild.get( arrayGroup.get( groupPosition )).size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return arrayGroup.get(groupPosition);
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return arrayChild.get( arrayGroup.get( groupPosition)).get(childPosition);
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override
    public boolean hasStableIds() {
        return false;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        String groupName = arrayGroup.get(groupPosition);
        View v  = convertView;

        if( v == null){
            LayoutInflater inflater=  (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = (RelativeLayout)inflater.inflate(R.layout.listviewitem_group, null);
        }
        TextView textGroup = (TextView) v.findViewById(R.id.textGroup);
        textGroup.setText(groupName);

        return v;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        String childName = arrayChild.get(arrayGroup.get(groupPosition)).get(childPosition);
        View v  = convertView;


        if( v == null){
            LayoutInflater inflater=  (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = (RelativeLayout)inflater.inflate(R.layout.listviewitem_child, null);
        }
        TextView textChild = (TextView) v.findViewById(R.id.textChild);
        textChild.setText(childName);

        return v;
    }

    @Override
    public boolean isChildSelectable(int i, int i1) {
        return true;
    }


}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:andriod="http://schemas.android.com/apk/res-auto"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.myexpandable.MainActivity">

    <ExpandableListView
        android:id="@+id/expandableListView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
</RelativeLayout>

listviewitem_group.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/textChild"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_marginLeft="20dp"
        android:padding="10dp"
        android:text="Child"/>

</RelativeLayout>

listviewitem_child.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/textGroup"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_marginLeft="20dp"
        android:padding="20dp"
        android:text="Group" />

</RelativeLayout>
  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • Child 리스트를 생성할 때, 이름과 함께 Url 정보도 추가할 수 있도록 코드를 수정하시기 바랍니다. 현재 Child 리스트에 아이템을 다음과 같이 추가하고 있는데요.

    ArrayList<String> arrayPizza = new ArrayList<String>();
    arrayPizza.add("피자헛");
    arrayPizza.add("피자스쿨");
    arrayPizza.add("미스터피자");
    arrayPizza.add("피자에땅");
    arrayPizza.add("피자알볼로");
    

    방법1

    다음과 같이 이름과 Url 두 정보를 저장할 수 있는 별도의 모델을 만들어서 리스트에 아이템을 추가하시기 바랍니다. 코드는 필요한 부분만 작성했습니다.

    ArrayList<Store> arrayPizza = new ArrayList<Store>();
    arrayPizza.add(new Store("피자헛", "http://..."));
    arrayPizza.add(new Store("피자스쿨", "http://..."));
    arrayPizza.add(new Store("미스터피자", "http://..."));
    arrayPizza.add(new Store("피자에땅", "http://..."));
    arrayPizza.add(new Store("피자알볼로", "http://..."));
    
    ...
    
    arrayChild.put(arrayGroup.get(0), arrayPizza);
    
    ...
    
    static class Store {
    
        String name;
        String url;
    
        public Model(String name, String url) {
            this.name = name;
            this.url = url;
        }
    }
    

    방법2

    별도의 모델을 만들고 싶지 않다면 Pair 클래스를 사용하는 것도 방법입니다. (참고, 클릭 리스너에서 Pair의 first, second 필드를 통해서 이름과 Url을 가져올 수 있습니다. 자세한 내용은 문서를 확인하세요.)

    ArrayList<Pair> arrayPizza = new ArrayList<>();
    arrayPizza.add(new Pair<>("피자헛", "http://..."));
    arrayPizza.add(new Pair<>("피자스쿨", "http://..."));
    arrayPizza.add(new Pair<>("미스터피자", "http://..."));
    arrayPizza.add(new Pair<>("피자에땅", "http://..."));
    arrayPizza.add(new Pair<>("피자알볼로", "http://..."));
    
    ...
    arrayChild.put(arrayGroup.get(0), arrayPizza);
    
    ...
    

    웹뷰

    현재 코드는 클릭 시 토스트로 이름을 출력하고 있는데요. 같은 방법으로 Url을 가져와서 웹뷰를 띄우면 됩니다. 이 부분은 코드가 없어도 해결할 수 있을 것 같아 따로 코드를 작성하지 않았습니다.

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

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

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

(ಠ_ಠ)
(ಠ‿ಠ)