使用ViewHolder的Android listview
我有个问题。我试图在单击listview后更改它中的图标。它工作正常,尽管不仅修改了单击的图标,而且修改了未显示的图标。例如,如果我单击listview第一项中的图标,第五个图标也会更改。对于以下所有项目(listview的每五个项目)重复此行为。 这是我的getView方法:使用ViewHolder的Android listview,android,android-listview,android-arrayadapter,android-viewholder,Android,Android Listview,Android Arrayadapter,Android Viewholder,我有个问题。我试图在单击listview后更改它中的图标。它工作正常,尽管不仅修改了单击的图标,而且修改了未显示的图标。例如,如果我单击listview第一项中的图标,第五个图标也会更改。对于以下所有项目(listview的每五个项目)重复此行为。 这是我的getView方法: public class AlphabeticalAdapter extends ArrayAdapter<String> { int layoutResourceId;
public class AlphabeticalAdapter extends ArrayAdapter<String>
{
int layoutResourceId;
private final Context context;
private List<String> data;
private ProgressDialog mProgressDialog;
private ImageView downloadImageButton;
public AlphabeticalAdapter(Context context, int resource, List<String> data){
super(context, resource, data);
this.layoutResourceId = resource;
this.context = context;
this.data = data;
}
public View getView(int position, View convertView, ViewGroup parent) {
// View rowView = convertView;
final ViewHolder viewHolder;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.catalogslist_single_row, parent, false);
viewHolder = new ViewHolder();
viewHolder.catlogTitle=(TextView)convertView.findViewById(R.id.txtTitle);
viewHolder.icon=(ImageView)convertView.findViewById(R.id.imageView2);
viewHolder.downloadImageButton=(ImageView)convertView.findViewById(R.id.downloadImageButton);
//downloadImageButton = (ImageView)rowView.findViewById(R.id.downloadImageButton);
viewHolder.position = position;
viewHolder.downloadImageButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("DOWNLOAD PRESSED");
viewHolder.downloadImageButton = (ImageView)v.findViewById(R.id.downloadImageButton);
viewHolder.downloadImageButton.setImageResource(R.drawable.icon_ok);
viewHolder.downloadImageButton.setTag("downloaded");
//rowView.setTag("downloaded");
}
});
convertView.setTag(viewHolder);
}
else{
viewHolder= (ViewHolder)convertView.getTag();
}
viewHolder.catlogTitle.setText(data.get(position));
viewHolder.catlogTitle.setTypeface(regularDin);
viewHolder.icon.setImageResource(R.drawable.cata);
if(viewHolder.downloadImageButton.getTag() == "downloaded"){
downloadImageButton = (ImageView)convertView.findViewById(R.id.downloadImageButton);
downloadImageButton.setImageResource(R.drawable.icon_ok);
}
else{
downloadImageButton = (ImageView)convertView.findViewById(R.id.downloadImageButton);
downloadImageButton.setImageResource(R.drawable.icon_download);
}
viewHolder.position = position;
return convertView;
} //close getView
在下面更改您的代码。我想你错过了
public class AlphabeticalAdapter extends ArrayAdapter<String> {
int layoutResourceId;
private final Context context;
private List<String> data;
private List<String> tags;
private ProgressDialog mProgressDialog;
private ImageView downloadImageButton;
public AlphabeticalAdapter(Context context, int resource, List<String> data) {
super(context, resource, data);
this.layoutResourceId = resource;
this.context = context;
this.data = data;
tags = new ArrayList<String>();
int size = data.size();
for (int i = 0; i < size; i++) {
tags.add("tag");
}
}
static class ViewHolder {
ImageView downloadImageButton;
TextView catlogTitle;
ImageView icon;
int position;
}
public View getView(final int position, View convertView, ViewGroup parent) {
// View rowView = convertView;
final ViewHolder viewHolder;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// convertView = inflater.inflate(R.layout.catalogslist_single_row,
// parent, false);
viewHolder = new ViewHolder();
viewHolder.position = position;
viewHolder.downloadImageButton
.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("DOWNLOAD PRESSED");
viewHolder.downloadImageButton.setTag("downloaded");
tags.add(position, "downloaded");
}
});
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.catlogTitle.setText(data.get(position));
viewHolder.catlogTitle.setTypeface(regularDin);
viewHolder.icon.setImageResource(R.drawable.cata);
if (tags.get(position) == "downloaded") {
downloadImageButton.setImageResource(R.drawable.icon_ok);
} else {
downloadImageButton.setImageResource(R.drawable.icon_download);
}
viewHolder.position = position;
return convertView;
} // close getView
}
公共类字母适配器扩展了ArrayAdapter{
国际布局资源;
私人最终语境;
私人名单数据;
私有列表标签;
private ProgressDialog mProgressDialog;
私有ImageView下载ImageButton;
公共字母适配器(上下文、int资源、列表数据){
超级(上下文、资源、数据);
this.layoutResourceId=资源;
this.context=上下文;
这个数据=数据;
tags=newarraylist();
int size=data.size();
对于(int i=0;i
在您的列表视图
中,同时可见的转换视图
行数与可见行数相同(系统将重用它)。因此,实际上您有5个convertView
,因此,您有5个ImageView
作为图标。问题是您使用这些ImageView的标记来存储“下载”的信息。这是5状态,这就是为什么在列表中滚动时,每五行就有一行下载
我想现在你明白了,这是行不通的。您需要存储每个项目的下载状态,因此必须将基础的列表
更改为列表
,其中列表项
可以存储实际行的下载状态
之后,您所要做的就是更新
convertView
的ImageView
(在getView()
中)以显示正确的图标。像这样更改代码。在try块之前使用convertView添加空检查
final MenuItem menuItem = getItem(position);
View view = convertView;
final ViewHolder viewHolder;
if (convertView == null) {
LayoutInflater inflater;
inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.menu_item, parent, false);
viewHolder = new ViewHolder();
// viewHolder.half = (TextView) view.findViewById(R.id.half);
viewHolder.name = (TextView) view.findViewById(R.id.name);
viewHolder.description = (TextView) view.findViewById(R.id.description);
viewHolder.price = (TextView) view.findViewById(R.id.price);
viewHolder.add = (Button) view.findViewById(R.id.add);
viewHolder.selectedView = view.findViewById(R.id.selectedView);
viewHolder.remove = (Button) view.findViewById(R.id.remove);
viewHolder.total = (TextView) view.findViewById(R.id.itemTotal);
viewHolder.quantity = (TextView) view.findViewById(R.id.quantity);
view.setTag(viewHolder);
}else{
viewHolder= (ViewHolder)convertView.getTag();
}
public类AndroidListViewActivity扩展了ListActivity
{
私有列表视图列表视图;
私有字符串名称[]={
“高压电容器”,
“低压电容器”,
};
私有字符串描述[]={
“强大的Hypter文本标记语言5”,
“层叠样式表”,
};
专用整数imageid[]={
R.可牵引高压电容器,
R.可牵引低压电容器,
};
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//setContentView(R.layout.Capactor_layout);
//将字符串资源存储到数组中
字符串[]product\u name=getResources().getStringArray(R.array.product\u name);
//将数组绑定到ListAdapter
this.setListAdapter(新的ArrayAdapter(this,R.layout.list_项,R.id.label,product_名称));
ListView lv=getListView();
//在单击时侦听单个列表项
lv.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
//选定项目
字符串产品=((TextView)视图).getText().toString();
//在选择单个列表项时启动新活动
Intent i=newintent(getApplicationContext(),SingleListItem.class);
//向新活动发送数据
i、 putExtra(“产品”,产品);
星触觉(i);
}
});
电容器列表电容器列表=新电容器列表(此、名称、描述、图像ID);
listView=(listView)findViewById(R.id.listView);
setAdapter(电容器列表);
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
//在选择单个列表项时启动新活动
Intent i=新Intent(getApplicationContext(),capactorList.class);
//向新活动发送数据
//星触觉(i);
@凌驾
公共无效onItemClick(AdapterView AdapterView、View视图、int i、long l){
Toast.makeText(getApplicationContext(),“您单击了”+names[i],Toast.LENGTH\u SHORT.show();
}
final MenuItem menuItem = getItem(position);
View view = convertView;
final ViewHolder viewHolder;
if (convertView == null) {
LayoutInflater inflater;
inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.menu_item, parent, false);
viewHolder = new ViewHolder();
// viewHolder.half = (TextView) view.findViewById(R.id.half);
viewHolder.name = (TextView) view.findViewById(R.id.name);
viewHolder.description = (TextView) view.findViewById(R.id.description);
viewHolder.price = (TextView) view.findViewById(R.id.price);
viewHolder.add = (Button) view.findViewById(R.id.add);
viewHolder.selectedView = view.findViewById(R.id.selectedView);
viewHolder.remove = (Button) view.findViewById(R.id.remove);
viewHolder.total = (TextView) view.findViewById(R.id.itemTotal);
viewHolder.quantity = (TextView) view.findViewById(R.id.quantity);
view.setTag(viewHolder);
}else{
viewHolder= (ViewHolder)convertView.getTag();
}
public class AndroidListViewActivity extends ListActivity
{
private ListView listView;
private String names[] = {
"HV CAPACITOR",
"LV CAPACITORCSS",
};
private String desc[] = {
"The Powerful Hypter Text Markup Language 5",
"Cascading Style Sheets",
};
private Integer imageid[] = {
R.drawable.hv_capacitor,
R.drawable.lv_capacitor,
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.capacitor_layout);
// storing string resources into Array
String[] product_name = getResources().getStringArray(R.array.product_name);
// Binding Array to ListAdapter
this.setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, R.id.label, product_name));
ListView lv = getListView();
// listening to single list item on click
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// selected item
String product = ((TextView) view).getText().toString();
// Launching new Activity on selecting single List Item
Intent i = new Intent(getApplicationContext(), SingleListItem.class);
// sending data to new activity
i.putExtra("product", product);
startActivity(i);
}
});
CapacitorList capacitorList = new CapacitorList(this, names, desc, imageid);
listView = (ListView) findViewById(R.id.listView);
listView.setAdapter(capacitorList);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
// Launching new Activity on selecting single List Item
Intent i = new Intent(getApplicationContext(), CapacitorList.class);
// sending data to new activity
// startActivity(i);
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(getApplicationContext(), "You Clicked " + names[i], Toast.LENGTH_SHORT).show();
}
});
}
@Override
public boolean onCreateOptionsMenu (Menu menu){
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected (MenuItem item){
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
public class CustomArrayAdapter extends ArrayAdapter {
// declare your custom list with type;
private List<YourModelClass> allData = new ArrayList<YourModelClass>();
public CustomArrayAdapter(@NonNull Context context, List<YourModelClass> allData) {
super(context, R.layout.your_layout, allData); // add your_layout.xml
this.allData = allData;
}
class ViewHolder {
TextView name, phone; // declare your your_layout.xml view type
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ViewHolder holder = new ViewHolder();
if (convertView == null) {
convertView = inflater.inflate(R.layout.your_layout, parent, false); // inflate your_layout.xml
//initialize your your_layout.xml view
holder.name = convertView.findViewById(R.id.tv_item_name);
holder.phone = convertView.findViewById(R.id.tv_item_phone);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
//set value into your_layout.xml
holder.name.setText(allData.get(position).getName());
holder.phone.setText(allData.get(position).getNumber());
return convertView;
}