Ich habe ein Problem. Ich versuche, ein Symbol in meiner Listenansicht zu ändern, nachdem darauf geklickt wurde. Es funktioniert korrekt, obwohl nicht nur die angeklickten Symbole geändert werden, sondern auch diejenigen, die nicht angezeigt werden. Wenn ich beispielsweise auf das Symbol im ersten Element der Listenansicht klicke, ändert sich auch das fünfte Symbol. Dieses Verhalten wiederholt sich für alle folgenden Elemente (alle fünf Elemente der Listenansicht). Dies ist meine getView-Methode:
static class ViewHolder{
ImageView downloadImageButton;
TextView catlogTitle;
ImageView icon;
int position;
}
Divyang Metaliya
Ändern Sie Ihren Code unten. Ich glaube, das fehlt dir.
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
}
@Mark Ich habe meinen Code bearbeitet, sieh dir das an und sage dir, dass es dir hilft
– Divyang Metaliya
21. Juli 14 um 13:39 Uhr
Das ist falsch. Lesen Sie meine Antwort, um zu verstehen, warum. Dort ist die Anzahl der ViewHolder-Objekte nicht gleich der Anzahl der Zeilen. Was wäre sonst die Bedeutung des ViewHolder-Musters?
– kupsef
21. Juli 14 um 13:47 Uhr
@kupsef ja du hast recht. Eine andere andere Liste wurde dann seiner Arbeit hinzugefügt
– Divyang Metaliya
21. Juli 14 um 13:49 Uhr
@kupsef könntest du bitte ein Beispiel einfügen?
– Markieren
21. Juli 14 um 13:54 Uhr
@Mark Ich habe den Code aktualisiert, denke ich. Sie können auch eine Array-Liste verwenden, um Hashmap oder TreeSet für die ausgewählte Position zu erstellen.
– Divyang Metaliya
21. Juli 14 um 13:56 Uhr
kupsef
Es gibt genauso viele convertViews so viele Zeilen gleichzeitig in Ihrem sichtbar ListView (das System verwendet es wieder). Du hast also tatsächlich 5 convertView, und deswegen hast du 5 ImageView für die Ikonen. Das Problem ist, dass Sie das Tag dieser ImageView verwenden, um die “heruntergeladenen” Informationen zu speichern. Das ist der 5. Zustand, und deshalb sehen Sie jede fünfte heruntergeladene Zeile, während Sie in der Liste scrollen.
Ich schätze, jetzt siehst du, dass es nicht funktionieren wird. Sie müssen den heruntergeladenen Zustand für jedes Element speichern, also müssen Sie den zugrunde liegenden ändern List<String> zu List<ListItem>, wo ListItem kann den heruntergeladenen Zustand für die aktuelle Zeile speichern.
Danach müssen Sie nur noch die aktualisieren convertView‘S ImageView (in getView()), um das richtige Symbol anzuzeigen.
Ändern Sie Ihren Code so. Fügen Sie vor Ihrem Try-Block eine Nullprüfung mit convertView hinzu.
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;
}
}
Shilpa Todakar
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);
}
}
.
6509400cookie-checkAndroid-Listenansicht mit ViewHolderyes