Android自定义列表视图行布局问题
问题描述:
我已经定义了以下包含TextView,CheckBox和ProgressBar的布局。我有两个问题: -Android自定义列表视图行布局问题
当我点击列表项,它自动从升序到降序,反之亦然,什么可能是错误的,我实现?
如果我保持复选框的可见性为true,那么我没有得到onListItemClick()事件。
请在下面找到布局,我是Android新手。
<?xml version="1.0" encoding="utf-8"?>
<TextView
android:id="@+id/textUrl"
android:layout_width="318dp"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="40dp"
android:text="TextView" />
<ProgressBar
android:id="@+id/progressBar1"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/textUrl"
android:layout_marginLeft="40dp" />
<CheckBox
android:id="@+id/checkBox"
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:text="CheckBox" />
下面是我使用自定义的适配器类。
public class CustomListViewAdapter extends ArrayAdapter<ListItemData>
{
Context mContext;
int mlayoutResourceId;
List<ListItemData> mlistData = null;
public CustomListViewAdapter(Context context,List<ListItemData> objects)
{
super(context, R.layout.custom_listview_row2, objects);
mContext = context;
mlistData = objects;
}
@SuppressWarnings("static-access")
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View v = convertView;
ViewHolder vh;
if (null == v)
{
LayoutInflater inflator = ((Activity)mContext).getLayoutInflater();
v = inflator.inflate(R.layout.custom_listview_row2, parent,false);
vh = new ViewHolder();
vh.mUrlTextView = (TextView) v.findViewById(R.id.textUrl);
vh.mProgressBar = (ProgressBar) v.findViewById(R.id.progressBar1);
vh.mCheckBox = (CheckBox)v.findViewById(R.id.checkBox);
v.setTag(vh);
}
else
{
vh = (ViewHolder)v.getTag();
}
ListItemData itemData = mlistData.get(position);
vh.mUrlTextView.setText(itemData.mUrlName);
vh.mProgressBar.setProgress(itemData.mProgressValue);
return v;
}
}
代码ListActivity
public class CustomListViewActivity extends ListActivity
{
//List<HashMap<String, Object>> fillList = new ArrayList<HashMap<String, Object>>();
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.custom_list_view);
ArrayList<ListItemData> list = new ArrayList<ListItemData>();
for (int idx = 0; idx < 10;idx++)
{
ListItemData item = new ListItemData("", 0);
item.mUrlName = String.format("www.url-%d.com", idx);
item.mProgressValue = idx*10;
list.add(item);
}
CustomListViewAdapter adapter = new CustomListViewAdapter(this,list);
setListAdapter(adapter);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id)
{
super.onListItemClick(l, v, position, id);
ListItemData item = (ListItemData)getListAdapter().getItem(position);
Toast.makeText(this, String.format("%s - %d", item.mUrlName,item.mProgressValue), Toast.LENGTH_LONG).show();
}
}
答
我已经找到了以下问题
的答案。如果我保持复选框的知名度,真正的那么我没有得到 onListItemClick()事件。
答案 - 将Textview,复选框和进度条以及相对布局的可调焦设置为false。
答
此外,还找到了#2的答案。
当我点击列表项时,它会自动从升序到降序排序,反之亦然,在我的实现中可能会出错?
问题是因为我的ViewHolder类。这最初喜欢图所示
final class ViewHolder
{
public static TextView mUrlTextView;
public static ProgressBar mProgressBar;
public static CheckBox mCheckBox;
}
当我改变了它下面,事情就开始做工精细:)
class ViewHolder
{
public TextView mUrlTextView;
public ProgressBar mProgressBar;
public CheckBox mCheckBox;
}
由于类是静态的,标签值指向同一个实例。现在,在ViewHolder类中进行上述更改之后,列表中的每个项目都将单独的实例保存到查看持有者对象。事情开始按预期工作。
教训教训 - 千万不要做任何类的静态,除非它是绝对必要的.... :) :)
你的意思是,当你点击它是越来越排序?你的代码看起来如何?如果发生这种情况,它与代码而不是布局有关。你是如何在代码中对listview进行ifint的? – 2012-02-03 20:06:10
您好coder_for_life22,添加了我正在使用的自定义适配器类。 – Omkar 2012-02-03 20:15:27
当您点击一个项目时,您的列表项目正在重新排列? – 2012-02-03 20:23:33