6

Ich habe ein Problem. Ich versuche ein Symbol in meiner Listenansicht zu ändern, nachdem es angeklickt 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 wird für alle folgenden Elemente (alle fünf Elemente der Listenansicht) wiederholt. Das ist mein getView Methode:Android Listview mit ViewHolder

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 

...

Und das ist meine ViewHolder Klasse:

 static class ViewHolder{ 
     ImageView downloadImageButton; 
     TextView catlogTitle; 
     ImageView icon; 
     int position; 
    } 

Antwort

9

Ändern Sie den Code in unten, ich glaube, Sie fehlt, dass

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 

}

+0

habe ich versucht, diese Lösung, aber es funktioniert nicht :-( – Mark

+0

@ Mark i mein Code bearbeitet, finden Sie diese und sagen seine Hilfe Sie –

+0

Das ist falsch. Lesen Sie meine Antwort zu verstehen, warum. Es Anzahl der ViewHolder-Objekte nicht gleich der Anzahl der Zeilen. Was würde sonst das ViewHolder-Muster bedeuten? – kupsef

5

Es sind so viele convertViews so viele Zeilen gleichzeitig in Ihrer ListView sichtbar (das System verwendet sie erneut). Sie haben also tatsächlich 5 convertView, und deshalb haben Sie 5 ImageView für die Symbole. Das Problem besteht darin, dass Sie das ImageView-Tag verwenden, um die "heruntergeladenen" Informationen zu speichern. Das ist der 5-stufige Zustand, und deshalb sehen Sie jede fünfte heruntergeladene Zeile, während Sie in der Liste blättern.

Ich denke, jetzt sehen Sie, dass es nicht funktioniert. Sie müssen den heruntergeladenen Status für jedes Element speichern, daher müssen Sie das zugrunde liegende List<String> in List<ListItem> ändern, wobei ListItem den heruntergeladenen Status für die aktuelle Zeile speichern kann.

Danach müssen Sie nur die convertViewImageView (in getView()) aktualisieren, um das richtige Symbol zu zeigen.

0

Ändern Sie Ihren Code wie folgt. Fügen Sie vor dem try-Block eine Nullprüfung mit convertView hinzu.

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(); 
} 
0
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); 


    } 
} 
Verwandte Themen