문제

사용자 정의로 바인딩된 목록에 확인란 목록이 있습니다. simpleCursorAdapter.내 관습에 simpleCursorAdapter, 재정의했습니다 newView 그리고 bindView 내 수정으로.나는 어떻게든 다중 선택을 할 수 있게 되었습니다.이상한 점은 목록에서 항목을 삭제한 후 첫 번째 항목의 확인란이 갑자기 선택된다는 것입니다.어떻게 그런 일이 일어나나요?어떻게 해결할 수 있나요?

나의 SimpleCursorAdapter 수업:

public class MyListCursorAdapter extends SimpleCursorAdapter
{
    private Context context;
    private int layout;

    public MyCursorAdapter(Context context, int layout, Cursor c,
            String[] from, int[] to)
    {
        super(context, layout, c, from, to);
        this.context = context;
        this.layout = layout;
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent)
    {
        Cursor c = getCursor();
        final LayoutInflater inflater = LayoutInflater.from(context);
        View v = inflater.inflate(layout, parent, false);
        CheckBox chkBoxBtn = (CheckBox) v.findViewById (R.id.deleteTwittChkBox);
        if (chkBoxBtn != null)
        {
            chkBoxBtn.setChecked(false);
        }
        return v;
    }

    @Override
    public void bindView(View v, Context context, Cursor c)
    {
        --binding view to my textsview in my items
        //now it's the importat part:
            CheckBox chkBoxBtn = (CheckBox) v.findViewById(R.id.deleteTwittChkBox);
    if (chkBoxBtn != null)
    {
        chkBoxBtn.setId(Integer.valueOf(c.getString(c
                .getColumnIndex(MyUsers.User._ID))));
        chkBoxBtn.setOnClickListener(new OnItemClickListener(chkBoxBtn, v));
        chkBoxBtn.setChecked(false);
    }
    }

    //i couldnt find another way of doing this, but this is how i set listeners to my checkboxses
    static ArrayList<String> checkedItemsList = new ArrayList<String>();

    private class OnItemClickListener implements OnClickListener
    {
        private int mPosition;
        private CheckBox chkBox;
        OnItemClickListener(CheckBox mChkBox, View v)
        {
            chkBox = mChkBox;
            chkBox.setChecked(false);
        }

        @Override
        public void onClick(View v)
        {
            if (chkBox.isChecked())
            {
                checkedItemsList.add(String.valueOf(chkBox.getId()));
            }
            else
            {
                checkedItemsList.remove(String.valueOf(chkBox.getId()));
            }
        }
    }
}

다음은 코드 부분입니다. ListActivity 선택된 상자 항목을 삭제하는 버튼을 설명하는 클래스:

OnClickListener btListener = new OnClickListener()
{
    public void onClick(View view)
    {
        // long[] items = listView.getCheckItemIds();
        int x = 0;
        Uri myUri = Uri
        .parse("content://com.idan.datastorageprovider/users");
        String where = "_id" + "=?";
        //here i am tatking all checkboxes which ive added from the  adapter class
        ArrayList<String> checkedItemsList =   MySimpleCursorAdapter.checkedItemsList;
        for (String itemID : checkedItemsList)
        {
            getContentResolver()
            .delete(myUri, where, new String[] { itemID});
            checkedItemsList.remove(itemID);
        }
    }
};
도움이 되었습니까?

해결책

SimpleCursorAdapter가 여기에서 확장하기에 적합한 클래스인지 의심됩니다.

"확인됨" 상태가 어떤 방식으로든 데이터 XML에 연결되어 있나요?아니요?따라서 자신만의 맞춤형 어댑터가 필요합니다!

기본적으로 모든 어댑터는 주어진 요소(보다 정확하게는 요소 위치)에서 뷰를 생성하는 방법을 구현해야 합니다.이는 목록이 요소를 표시하려고 할 때 언제든지 호출됩니다.이제 더 이상 화면에서 볼 수 없는 이전에 생성된 목록 보기 요소를 재사용하는 방법이 사용됩니다!따라서:목록을 아래로 스크롤하고 요소가 상단에서 사라지면 정확하게 이 뷰 객체는 다음에 나타나는 항목에 재사용됩니다.

따라서 재사용해야 하는 지정된 "이전" 뷰로 이 메서드를 호출하면 포함된 모든 요소가 요소 데이터에 따라 설정되어야 합니다.체크박스가 이 게임의 일부인 경우 체크된 상태에 대한 저장 공간이 있어야 합니다!목록 요소가 있기 때문에 확인란 개체 수가 적기 때문에 확인란을 갖는 것만으로는 충분하지 않습니다!

SimpleCursorAdapters는 - 예 - 단순한 것을 표현하기 위해 존재합니다.데이터를 설명하는 XML(문서에 명시된 이미지 및 텍스트)입니다.이러한 단순성 때문에 여기서 해야 할 일은 새로운 요소 뷰 객체를 생성하는 방법을 제공하는 것뿐입니다. 재사용 프로세스를 전혀 방해하지 않습니다!기본적으로 기존 뷰 개체에 데이터를 넣는 방법만 알고 있지만 선택/선택 취소된 상자를 처리하는 방법에 대한 지식은 부족합니다.

귀하의 솔루션:자신만의 BaseAdapter 확장을 작성하고 수행해야 할 작업을 수행합니다."getView"(및 getItem, getItemId 및 getCount와 같은 다른 메소드)를 구현합니다.전혀 어렵지 않아요!이것 API 데모 BaseAdapter를 사용하고 mExpanded 여기 상태는 기본적으로 확인란 상태와 동일합니다!

행운을 빌어요!

다른 팁

전화해야 할 수도 있습니다 NotifyDatasetchEnged 데이터를 수정할 때.

문제는 아마도 OnitemClickListener 내에서 설정을 한 것으로 부르는 것입니다. 이 주위의 해킹 방법 중 하나는 청취자 내에서 세트 체크를 호출하기 전후에 다음을 수행하는 것입니다.

chkBox.setClickable(false);
chkBox.setChecked(false);
checkBox.setClickable(true);

이렇게하면 setChecked를 수동으로 호출 할 때 onitemClickListener가 호출되는 것을 방지합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top