Как получить элемент представления с помощью ResourceCursorAdapter, когда я щелкаю виджет в представлении списка - PullRequest
1 голос
/ 23 января 2012

У меня есть эта конкретная проблема, которая следует за мной с нескольких дней. Я воспользовался поиском, но не смог найти ни одной статьи, которая бы еще не помогла мне. Я думаю, это тоже проблема моего поиска. однако вернемся к моему вопросу.

Я использую ResourceCursorAdapter для заполнения моего ListView.
Мой элемент ListView выглядит как ..

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

        <TextView
            android:id="@+id/title_tv"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
        <TextView
            android:id="@+id/description_tv"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
        <CheckBox
            android:id="@+id/download_cb"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
        <Button
            android:id="@+id/some_bt"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
        <ImageButton
            android:id="@+id/pdf_ib"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
        <ProgressBar
            android:id="@+id/download_pb"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="fill_parent"
            android:layout_height="10dip" />
    </RelativeLayout>       

Мой адаптер:

private final class ListAdapter extends ResourceCursorAdapter implements
        DownloadCallback, OnItemClickListener, OnClickListener {

            public ListAdapter(Context context, int layout, Cursor c) {
        super(context, layout, c);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        final ItemHolder holder = (ItemHolder) view.getTag();

        holder.url = cursor.getString(..);

        holder.titleTv.setText(cursor.getString(..));
        holder.descriptionTv.setText(cursor.getString(..));
        ...

        if(cursor.getInt(..) == 1) {
            holder.progress.setVisible(View.GONE);          
        }

        if(cursor.getInt(...) == 1) {
            holder.downloadCb.setEnabled(isConnectedToNet); 
        }
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        View view = super.newView(context, cursor, parent);
        ItemHolder holder = new ItemHolder();

        view.setOnClickListener(this);

        holder.titleTv = (TextView) view.findViewById(R.id.title_tv);
        holder.descriptionTv = (TextView) view.findViewById(R.id.description_tv);
        ...

        holder.downloadCb.setEnabled(isConnectedToNet);                 
        holder.downloadCb.setOnClickListener(this);         
        holder.downloadCb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {                    
                prepare2Download();

                DownItem di = new DownItem();
                di.url = holder.url;        /// <========= to do this               

                // start async downloader and notify progressbar "holder.downPb"                    
                Download serverTaskObject = new Download();                 
                serverTaskObject.execute(currDownholder.copy());    

                holder.downPb.setVisibility(View.GONE);     // <======== and this.          
            }
        });

        holder.pdfIb = (ImageButton) view.findViewById(R.id.pdf_ib);
        holder.pdfIb.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // start new activity and load website.
                openUrl(holder.url);    // <============ or this.
            }
        });

        holder.downPb = (ProgressBar) view.findViewById(R.id.pb_law_download);
        holder.downPb.setVisibility(View.GONE);

        view.setTag(cachedItem);
        return view;
    }

    ...

    private static class LawItemCache {
        TextView titleTv;
        TextView descriptionTv;
        ...

        CheckBox downloadCb;
        ImageButton pdfIb;

        ProgressBar downPb;

        String url;
        IProgressListener listener;
    }
}

Мой вопрос .. Когда я нажимаю кнопку или флажок в ListView, я хочу внести некоторые изменения в конкретный держатель представления, например сделать Progressbar видимым или пропавшим. Я пока не могу понять, как мне установить держатель View в моем адаптере для внесения изменений.

Надеюсь, я объяснил это достаточно хорошо, чтобы понять суть моей проблемы.

1 Ответ

1 голос
/ 08 февраля 2012

Я много боролся с этим и, наконец, смог заставить его работать!У меня есть флажок в моей строке и использование ResourceCursorAdapter.Хитрость заключалась в том, чтобы понять, что обработчик нажатых флажков должен быть привязан либо в getView (), либо в newView (), а держатель должен быть связан в bindView ().Таким образом, отображаемые в данный момент строки в ListView всегда имеют правильную информацию о владельце.Вот мои методы bindView и getView:

 public void bindView(View view, Context context, Cursor cursor) {
                Log.i(CN,"bindView");
                TextView todoTxt = (TextView)view.findViewById(R.id.todoItemText);
                Log.i(CN,"bindView set txt");
                TextView todoTitle = (TextView)view.findViewById(R.id.todoItemTitle);
                Log.i(CN,"bindView set title");
                CheckBox cBox = (CheckBox)view.findViewById(R.id.todoChecked);
                Log.i(CN,"bindView set check");

                IOweRowTag tag=(IOweRowTag)cBox.getTag();
                int pos=cursor.getInt(cursor.getColumnIndex(Todos._ID));
                Log.i(CN,"getView: no tag on "+pos);
                tag=new IOweRowTag();
                tag.id=pos;
                cBox.setTag(tag);

//              IOweRowTag irt=(IOweRowTag)view.getTag();
//              if(irt!=null)
//                  Log.i(CN,"Got irt id="+irt.id);
//              else
//                  Log.i(CN,"No id");
//              
                Log.i(CN,"got title="+cursor.getString(cursor.getColumnIndex(Todos.TITLE)));
                Log.i(CN,"got txt="+cursor.getString(cursor.getColumnIndex(Todos.TEXT)));

                todoTitle.setText(cursor.getString(cursor.getColumnIndex(Todos.TITLE)));
                todoTxt.setText(cursor.getString(cursor.getColumnIndex(Todos.TEXT)));
                cBox.setChecked(true);

            }




        public View getView (int position, View convertView, ViewGroup parent) {
            View tmpView=super.getView(position, convertView, parent);
            Log.i(CN,"getView:"+position);
            final CheckBox cBox = (CheckBox) tmpView.findViewById(R.id.todoChecked);
            IOweRowTag tag=(IOweRowTag)cBox.getTag();
            cBox.setOnClickListener(new OnClickListener() { 

                public void onClick(View v) { 
                    IOweRowTag tag=(IOweRowTag)v.getTag();
                    if(tag==null)
                        Log.i(CN,"checkbox clicked no tag");
                    else
                        Log.i(CN,"checkbox clicked tag="+tag.id);
                   if(cBox.isChecked()) { 
                       Log.i(CN," Checked!"); 
                       // do some operations here 
                   }   
                   else{ 
                       Log.i(CN,"NOT Checked!"); 
                       // do some operations here 
                   }
               }
                });


            return tmpView;
        }

Надеюсь, это поможет вам!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...