custom listview ta bort item

Diskussion i 'Frågor, support och diskussion' startad av Elprisionero, 13 feb 2011.

  1. Elprisionero

    Elprisionero Baby Droid Medlem

    Blev medlem:
    24 dec 2010
    Inlägg:
    15
    Mottagna gillanden:
    0

    MINA ENHETER

    Hej jag försöker ta bort en item från listview. Problemet är att när jag försöker ta bort rad 2 från listview samt i arrayen så tar den bort rad 1. När jag däremot klickar på rad 1 så tar den bort rad 1 som den ska.

    Ser man i utskrift o loggen så är ändå rätt värde kvar i arrayen.



    Kod:
    import java.util.ArrayList;
    import android.app.Activity;
    import android.content.Context;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.graphics.Color;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.MenuInflater;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.LinearLayout;
    import android.widget.ListView;
    import android.widget.TextView;
    import android.widget.BaseAdapter;
    public class MyBrands extends Activity implements OnItemClickListener {
    
       private static String userid;
       private static ArrayList<GetBrands> subscribedBrands;
       private static ListView listView;
    
    
       public void onCreate(Bundle savedInstanceState)  {
    
          super.onCreate(savedInstanceState);
          setContentView(R.layout.mybrands);
    
          SharedPreferences preferences = getSharedPreferences("saleRacer", 0);
          userid = preferences.getString("getId","");
       
    
    
    
    
    
          JsonBrandSelected issubscribed = new JsonBrandSelected( userid, "testa2.php");
    
          subscribedBrands = issubscribed.getSubscribed();
          System.out.println("it has x children: " + subscribedBrands.size());
    
          System.out.println("children name:");
          for (GetBrands b : subscribedBrands) {
             System.out.println(" id: " +b.getId() +
                   "name: " + b.getBrandNames() 
             );
          }
          listView = (ListView) findViewById(R.id.ListView01);
          listView.setAdapter(new EfficientAdapter(this));
          listView.setClickable(true);
          listView.setOnItemClickListener(this);
    
    
    
    
    
    
       }
       private static class EfficientAdapter extends BaseAdapter {
          private LayoutInflater mInflater;
    
          private int counter;
          public EfficientAdapter(Context context) {
             mInflater = LayoutInflater.from(context);
             counter = 0;
             //         this.subscribedBrands = subscribedBrands;
          }
          public int getCount() {
             // TODO Auto-generated method stub
             return subscribedBrands.size();
          }
          public Object getItem(int position) {
             return position;
          }
    
          public long getItemId(int position) {
             return position;
          }
    
    
          public View getView(int position, View convertView, ViewGroup parent) {
             ViewHolder holder;
             if (convertView == null) {
    
    
                convertView = mInflater.inflate(R.layout.listview, null);
                holder = new ViewHolder();
             
                holder.text2 = (TextView) convertView.findViewById(R.id.brandname);
    
    
                System.out.println("build2 id: " + subscribedBrands.get(position).getId() +
                      "position: " + position +
                      "name: " + subscribedBrands.get(position).getBrandNames());
                holder.text2.setText(subscribedBrands.get(position).getBrandNames());
    
    
    
    
    
    
                
                holder.text2.setTextColor(Color.RED);
          
             } else {
                holder = (ViewHolder) convertView.getTag();
             }
    
             return convertView;
          }
    
          static class ViewHolder {
    
             TextView text2;
          }
    
    
       }
       //   private ArrayList <Integer> selectedIds = new ArrayList<Integer>();
       /** Called when the activity is first created. */
    
          public boolean onCreateOptionsMenu(Menu menu){
       
             MenuInflater inflater = getMenuInflater();
       
             inflater.inflate(R.menu.allbrands, menu);
       
             return true;
       
       
          }
          // decide what the menuitems will do
          public boolean onOptionsItemSelected(MenuItem item) {
             switch (item.getItemId()) {
             case R.id.allbrands:     
                Intent intent = new Intent(MyBrands.this, Main.class);
                intent.putExtra("tab",3);
                startActivity(intent);
       
                break;
             }
             return false;
          }
    
    
    
    
    
    
       public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
    
          int selectedId = subscribedBrands.get(arg2).getId();
    
          System.out.println("tar bort: " + arg2 +
                "brand id: " + selectedId +
                " name: " + subscribedBrands.get(arg2).getBrandNames());
    
    
    
    
    
    
          JsonUpdateUBrands reader = new JsonUpdateUBrands( selectedId, userid, "testa2.php");
    
          subscribedBrands.remove(arg2);
          System.out.println("whats left?");
          for (GetBrands b: subscribedBrands) {
             System.out.println("id:" + b.getId() +
                   " name: " + b.getBrandNames());
          }
    
                listView.invalidateViews();
     
  2. foobar17

    foobar17 Kid Droid Medlem

    Blev medlem:
    12 jun 2009
    Inlägg:
    56
    Mottagna gillanden:
    11

    MINA ENHETER

    På sista raden i din kod gör du
    listView.invalidateViews();

    Jag förslår du prövar med att notifiera din adapter i stället
    ( (BaseAdapter)listView.getAdapter() ).notifyDataSetChanged();

    Mer info finns på http://developer.android.com/reference/android/widget/BaseAdapter.html#notifyDataSetChanged()

    I den kod du visar här ovan är din EfficientAdapter beroende av variabler (subscribedBrands) i den yttre klassen, även om denna koppling tillfälligtvis försvunnit när du gjort klassen till static.

    Rent generellt, rekommenderar jag att bygga en egen adapter mha ArrayAdapter<ItemType>. Det gör det enklare att återanvända koden på fler ställen och att enhetstesta den.

    Något i stil med
    ArrayAdapter<GetBrands> brandsAdapter = new ArrayAdapter<GetBrands>(getContext(), R.layout.listview, subscribedBrands);

    Att ta bort ett item:
    ArrayAdapter<GetBrands> brandsAdapter = (ArrayAdapter<GetBrands>)listView.getAdapter();
    brandsAdapter.remove(brandsObjToRemove);

    Att ladda adaptern på nytt:
    brandsAdapter.clear();
    for (GetBrands b: subscribedBrands) {brandsAdapter.add(b);}

    Mer info på: http://developer.android.com/reference/android/widget/ArrayAdapter.html