Удалить элемент из пользовательского списка при нажатии кнопки

У меня есть собственный список, который имеет 2 текстовых представления и 2 кнопки (кнопка воспроизведения и удаления). Я хочу, чтобы при нажатии кнопки удаления удалить текущую строку.

Мой класс адаптера

import java.util.ArrayList;

import android.content.Context;
import android.graphics.Color;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;

public class SunetePreferateAdaptor extends BaseAdapter {

    class ob {
        String titlu, descriere;

        public ob(String titlu, String descriere) {
            this.titlu = titlu;
            this.descriere = descriere;
        }
    }

    ArrayList<ob> lista;
    Context context;

    public SunetePreferateAdaptor(Context context) {
        this.context = context;
        lista = new ArrayList<ob>();

        for (int i = 1; i <= 20; i++) {
            lista.add(new ob("text", "text2"));

        }

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return lista.size();
    }

    @Override
    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return lista.get(arg0);
    }

    @Override
    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return arg0;
    }

    @Override
    public View getView(int arg0, View arg1, ViewGroup arg2) {
        // TODO Auto-generated method stub

        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row = inflater.inflate(R.layout.single_favsound_row, arg2, false);

        Button b2 = (Button) row.findViewById(R.id.button2);
        b2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // here, i want to delete the current row of the listview
                //
                //
            }
        });
        TextView titlu = (TextView) row.findViewById(R.id.singleText2);
        titlu.setText(lista.get(arg0).titlu);
        titlu.setTextColor(Color.WHITE);
        titlu.setTypeface(Global.font1);
        TextView descriere = (TextView) row.findViewById(R.id.singleText1);
        descriere.setText(lista.get(arg0).descriere);
        descriere.setTextColor(Color.WHITE);
        descriere.setTypeface(Global.font1);

        return row;
    }
}

Ну как я могу это сделать? Я пытался сделать arraylist статическим и удалить его элементы по щелчку... но безуспешно...


person Boldijar Paul    schedule 16.04.2014    source источник


Ответы (4)


Вам не нужно делать ArrayList статическим.

Вам нужно удалить данные из списка, который заполняет список. Вы вызываете notifyDataSetChanged();, чтобы обновить lsitview.

Вы можете удалить статическое ключевое слово и использовать

 Button b2 = (Button) row.findViewById(R.id.button1);
        b2.setTag(arg0); 
        b2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                int pos = (int)arg0.getTag();
                  lista.remove(pos);
                  SunetePreferateAdaptor.this.notifyDataSetChanged();            }
        });

Альтернатива:

Вы можете передать список конструктору класса адаптера.

 ListView lv = (ListView) this.findViewById(R.id.listView1);    
     ArrayList<ob> lista = new ArrayList<ob>();

        for (int i = 1; i <= 20; i++) {
            lista.add(new ob("text", "text"+i));

        }

lv.setAdapter (новый SunetePreferateAdaptor (это, список));

Затем сделайте это в отдельном файле .java

class ob {
    String titlu, descriere;

    public ob(String titlu, String descriere) {
        this.titlu = titlu;
        this.descriere = descriere;
    }
}

затем

public class SunetePreferateAdaptor extends BaseAdapter {


    ArrayList<ob> lista;
    Context context;

    public SunetePreferateAdaptor(Context context, ArrayList<ob> lista ) {
        this.context = context;
        this.lista= lista;

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return lista.size();
    }

    @Override
    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return lista.get(arg0);
    }

    @Override
    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return arg0;
    }

    @Override
    public View getView(int arg0, View arg1, ViewGroup arg2) {
        // TODO Auto-generated method stub

        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row = inflater.inflate(R.layout.fg, arg2, false);

        Button b2 = (Button) row.findViewById(R.id.button1);
        b2.setTag(arg0);
        b2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                int pos = (int)arg0.getTag();
                  lista.remove(pos);
                  SunetePreferateAdaptor.this.notifyDataSetChanged();            }
        });
        TextView titlu = (TextView) row.findViewById(R.id.textView1);
        titlu.setText(lista.get(arg0).titlu);
        titlu.setTextColor(Color.WHITE);

        TextView descriere = (TextView) row.findViewById(R.id.textView2);
        descriere.setText(lista.get(arg0).descriere);


        return row;
    }
}
person Raghunandan    schedule 16.04.2014
comment
SunetePreferateAdaptor.this.notifyDataSetChanged(); сделал трюк - person Roisgoen; 09.12.2014
comment
использование этого только первого элемента удаляет не конкретный элемент. - person NagarjunaReddy; 09.12.2014
comment
каждый раз, когда позиция приближается к нулю. - person NagarjunaReddy; 09.12.2014
comment
@NagarjunaReddy, твоя проблема может быть другой. Опубликовать новый вопрос. Однако приведенное выше решение работает - person Raghunandan; 09.12.2014

попробуй это

b2.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            lista.remove(position);
            SunetePreferateAdaptor.notifyDataSetChanged();
        }
    });
person Zeer0    schedule 16.04.2014
comment
@Paul, это должно быть arg0, а не position, и, поскольку он находится внутри анонимного внутреннего класса, он должен быть final, или вы можете сделать, как предложено в моем посте. - person Raghunandan; 16.04.2014
comment
@Paul, вам также нужно будет изменить этот public void onClick(View arg0) { на public void onClick(View v) {, потому что у вас есть public View getView(int arg0, View arg1, ViewGroup arg2) {, первый параметр также arg0 - person Raghunandan; 16.04.2014

Вы можете сделать это, используя свой список ArrayList. Сначала удалите элемент в текущей позиции и вызовите функцию adapter.notifyDataSetChanged().

person Top Cat    schedule 16.04.2014

Этот код работал абсолютно нормально для меня.

public class CustomAdapter extends ArrayAdapter<String>
{
Context c1;
String s1[];
int s2[];
CustomAdapter(Context c,String s[],int s3[])
{
    super(c,R.layout.tcustom,s);
    this.c1=c;
    this.s1=s;
    this.s2=s3;
}

public View getView(int position,View v,ViewGroup parent)
{
    LayoutInflater li=(LayoutInflater) c1.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    v=li.inflate(R.layout.tcustom,null);
    TextView tv=(TextView)v.findViewById(R.id.textView);
    ImageView im=(ImageView)v.findViewById(R.id.imageview);
    tv.setText(s1[position]);
    im.setImageResource(s2[position]);

    Button bt = (Button) v.findViewById(R.id.button);
    bt.setTag(position); //important so we know which item to delete on button click

    bt.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v)
        {
            v.setVisibility(View.GONE);
            notifyDataSetChanged();


            int positionToRemove = (int)v.getTag(); //get the position of the view to delete stored in the tag
            removeItem(positionToRemove); //remove the item
        }
    });

    return v;
}

public void removeItem(int position){
    //convert array to ArrayList, delete item and convert back to array
    ArrayList<String> a = new ArrayList<>(Arrays.asList(s1));
    a.remove(position);
    String[] s = new String[a.size()];
    s=a.toArray(s);
    s1 = s;
    notifyDataSetChanged(); //refresh your listview based on new data

}
 public int getCount() {
  return s1.length;
 }
 public String getItem(int position) {
 return s1[position];
 }}
person Nikhil Khurana    schedule 17.06.2015