我有这个特殊的问题,几天后就跟着我。我用过搜索但是找不到任何文章对我的问题有帮助。我想这也是我的搜索问题。 但是,回到我的问题。
我使用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中的按钮或复选框时,我想在特定的视图持有者中进行一些更改,比如使进度条可见或消失。 我无法弄清楚如何在我的适配器中获取View holder来进行更改。
我希望我能够很好地解释它以解决我的问题。
答案 0 :(得分:1)
我为此苦苦挣扎,终于成功了!我的行中有一个复选框,使用ResourceCursorAdapter。诀窍是要意识到复选框点击的处理程序需要在getView()或newView()中绑定,而holder需要在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;
}
希望这能帮到你!