빡빡종
405
2018-12-27 00:24:43
0
227

[안드로이드] 리스트뷰안의 체크박스 오작동


리스트뷰에 체크박스를 추가했는데 getview에서 재활용하는 문제때문이라던데...

스크롤을 하면 체크박스가 자기멋대로 체크되고 풀리고 합니다.

구글링 통해서 holder? 같은거랑 다른방법 그대로 해봐도 오류가 나거나 작동하지 않더라구요

제 코드 보시고 해결방법 한번 알려주시면 감사하겠습니다.


리스트뷰 xml 부분입니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/r1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/pro"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:layout_marginLeft="5dp"
        android:layout_weight="0"
        android:gravity="center|left"
        android:orientation="horizontal">

        <com.mikhaellopez.circularimageview.CircularImageView
            android:id="@+id/texticon"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_marginLeft="10dp"
            app:civ_border_width="0dp"
            app:srcCompat="@mipmap/ic_launcher" />

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <TextView
                android:id="@+id/textTitle"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_marginBottom="5dp"
                android:fontFamily="@font/nan"
                android:gravity="center_vertical"
                android:paddingLeft="10dp"
                android:text="카카오톡"
                android:textAlignment="center"
                android:textColor="#000000"
                android:textSize="12sp"
                android:textStyle="bold" />

        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="right|center"
            android:orientation="horizontal">

            <CheckBox
                android:id="@+id/ck"
                android:layout_width="30dp"
                android:layout_height="30dp"
                android:layout_marginRight="10dp"
                android:text="adsawd" />
        </LinearLayout>


    </LinearLayout>


</RelativeLayout>





public class appVo {
    String appName;  //어플 이름
    Drawable appIcon; //어플 아이콘
    String ck; //어플 이름(체크박스에 들어감)

   
    public appVo(String appName, Drawable appIcon, String ck) {
        this.appName = appName;
        this.appIcon = appIcon;
        this.ck = ck;
    }

    public String getAppName() {
        return appName;
    }

    public Drawable getAppIcon() {
        return appIcon;
    }

    public String getAppPack() {
        return appPack;
    }

    public int getRun_app() {
        return run_app;
    }

    public int getPlaytime() {
        return playtime;
    }

    public String getCk() {
        return ck;
    }
}



어댑터 부분입니다.

public class addAppAdapter extends BaseAdapter {
    private Context context;
    private int layout;
    private ArrayList<appVo> appData;
    private LayoutInflater lif;
    CheckBox ck;

    public addAppAdapter(Context context, int layout, ArrayList<appVo> appData) {
        this.context = context;
        this.layout = layout;
        this.appData = appData;
        this.lif = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);

    }

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

    @Override
    public Object getItem(int i)
    {
        return appData.get(i);
    }
    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(final int i, View view, ViewGroup viewGroup) { 
        if(view==null){
            view = lif.inflate(layout, viewGroup, false);
        }

        ImageView texticon = view.findViewById(R.id.texticon);
        texticon.setImageDrawable(appData.get(i).getAppIcon());
        
        TextView textTitle = view.findViewById(R.id.textTitle);
        textTitle.setText(appData.get(i).getAppName());

        ck = view.findViewById(R.id.ck);
        ck.setText(appData.get(i).getCk());


//        ck.setFocusable(false);
//        ck.setClickable(false);
        return view;
    }
}


액티비티 부분입니다.

휴대폰에 설치되어있는 패키지이름과 아이콘을 abc메소드에서 어레이리스트에 추가합니다.

public class addApp extends AppCompatActivity {
    ArrayList appData;
    private ListView listView_add;
    addAppAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_add_app);

        listView_add = findViewById(R.id.listview_add);
        listView_add.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
        appData = new ArrayList<>();
        adapter = new addAppAdapter(getApplicationContext(), R.layout.addapplist, appData);

        listView_add.setAdapter(adapter);
        adapter.notifyDataSetChanged();
        appData.clear();
        //listView_add.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        abc();

    }

    public void abc(){
        PackageManager packageManager = getApplicationContext().getPackageManager();
        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        List<ResolveInfo> AppInfos = packageManager.queryIntentActivities(intent, 0);
        for (ResolveInfo info : AppInfos) {
            ActivityInfo ai = info.activityInfo;
            Drawable appIcon;
            try {
                        appIcon = getPackageManager().getApplicationIcon(ai.packageName);
                        appData.add(new appVo(ai.loadLabel(packageManager).toString(), appIcon, ai.loadLabel(packageManager).toString()));
                        adapter.notifyDataSetChanged();

            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
}


~~하면 됩니다. 라고 하셔두 제가 실력이 부족하여 잘 모릅니다 ㅠㅠ

때문에 조금 자세하게 알려주시면 감사하겠습니다.


0
0
  • 답변 0

  • 로그인을 하시면 답변을 등록할 수 있습니다.