【问题标题】:How to refresh listView after database operation数据库操作后如何刷新listView
【发布时间】:2017-12-04 06:27:01
【问题描述】:

我的ListView操作后如何更新数据?在自定义适配器的onClick 中?在 MainActivity OnResume?我看到很多关于这方面的帖子,但每次他们只是给出了一行代码而不是放在哪里。

我的自定义适配器:

    class CustomAdapter extends ArrayAdapter {

    private Context context;
    private LayoutInflater inflater;
    private ArrayList<Contact> arrayList; //Lui transmettre le tableau adapter
    private ContactDatabase db;

    public CustomAdapter(Context context, ArrayList<Contact> arrayList){
        super(context, R.layout.contact_list, arrayList);
        db = new ContactDatabase(context);
        this.context = context;
        inflater = LayoutInflater.from(context);
        this.arrayList = arrayList;
    }

    private class ViewHolder{
        TextView txtName, txtPhone;
        ImageView tete, dial;
    }


    @NonNull
    @Override
    public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        ViewHolder viewHolder;

        if(convertView == null){
            //Reglage general
            viewHolder = new ViewHolder();
            convertView = inflater.inflate(R.layout.contact_list, parent, false); //Layout du design

            //Recuperation des ID
            viewHolder.txtName = convertView.findViewById(R.id.clName);
            viewHolder.txtPhone = convertView.findViewById(R.id.clNumber);
            viewHolder.tete = convertView.findViewById(R.id.cl_icone);
            viewHolder.dial = convertView.findViewById(R.id.cl_dial);

            //Definition du tag
            convertView.setTag(viewHolder);

        }else{
            viewHolder = (ViewHolder) convertView.getTag();
        }

        //Definition des changements
        final Contact contact = arrayList.get(position);
        //viewHolder.txtName.setText(db.dbToString(position + 1));
        viewHolder.txtName.setText(Integer.toString(contact.getId()));
        viewHolder.txtPhone.setText(contact.getPhone());
        viewHolder.tete.setImageResource(contact.getImage());

        //Change color
//        int backgroundColor = ContextCompat.getColor(context, contact.getColor());
//        viewHolder.txtPhone.setTextColor(backgroundColor);


        //OnClick sur l'icone telephone
        viewHolder.dial.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
                        Uri.parse("tel:" + contact.getPhone()));
                //context.startActivity(intent);
                db.delete(contact.getId());
            }
        });

//        //OnClick sur l'icone image
        viewHolder.tete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                Intent intent = new Intent(context, AddContactActivity.class); //On creer l'intent de donnee
//                intent.putExtra("BUNDLE", args); //On place les donnes enregistrer dans l'intent quon fera passe
//                intent.putExtra("index", position); //On place les donnes enregistrer dans l'intent quon fera passe
//                ((Activity) context).startActivityForResult(intent, 100);

            }
        });


        return convertView;
    }

}

My Main Activity:

public class MainActivity extends AppCompatActivity{

    private ListView listView;
    private FloatingActionButton btnAdd;
    private ArrayList<Contact> contacts;
    ContactDatabase db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Definition des ID
        btnAdd = findViewById(R.id.btn_add);
        listView = findViewById(R.id.list_view); //Recheche du listView
        listView.setEmptyView(findViewById(R.id.empty_list)); //Si listView est vide alors on affiche ce message


        //Listener pour le button ADD
        btnAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, AddContactActivity.class);
                startActivity(intent);
            }
        });


    }

    @Override
    protected void onResume() {
        super.onResume();
        //Creation de ladapter
        db = new ContactDatabase(this);
        contacts = db.getData();
        CustomAdapter adapter = new CustomAdapter(this, contacts);
        listView.setAdapter(adapter);
    }


}

你能不能给我放的代码和准确的放哪里,这样每次操作后我的listView会自动刷新

【问题讨论】:

    标签: java android database listview adapter


    【解决方案1】:

    更改代码

    private ListView listView;
    private FloatingActionButton btnAdd;
    private ArrayList<Contact> contacts;
    ContactDatabase db;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        //Definition des ID
        btnAdd = findViewById(R.id.btn_add);
        listView = findViewById(R.id.list_view); //Recheche du listView
        listView.setEmptyView(findViewById(R.id.empty_list)); //Si listView est vide alors on affiche ce message
    
    
        //Listener pour le button ADD
        btnAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, AddContactActivity.class);
                startActivity(intent);
            }
        });
    
    
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        //Creation de ladapter
        db = new ContactDatabase(this);
        contacts = db.getData();
        CustomAdapter adapter = new CustomAdapter(this, contacts);
        listView.setAdapter(adapter);
    }
    

    private ListView listView;
    private FloatingActionButton btnAdd;
    private ArrayList<Contact> contacts=new ArrayList<>();
    ContactDatabase db;
    CustomAdapter adapter;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        //Definition des ID
        btnAdd = findViewById(R.id.btn_add);
        listView = findViewById(R.id.list_view); //Recheche du listView
        listView.setEmptyView(findViewById(R.id.empty_list)); //Si listView est vide alors on affiche ce message
        adapter = new CustomAdapter(this, contacts);
        listView.setAdapter(adapter);
    
        //Listener pour le button ADD
        btnAdd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, AddContactActivity.class);
            startActivity(intent);
        }
    });
    
    @Override
    protected void onResume() {
       super.onResume();
       //Creation de ladapter
       contacts.clear();
       db = new ContactDatabase(this);
       contacts.addAll(db.getData());
       adapter.notifyDataSetChanged();
    }
    

    【讨论】:

      【解决方案2】:

      每次操作后我的listView自动刷新

      当您需要刷新listView时,只需致电adapter.notifyDataSetChanged();

      adapter.notifyDataSetChanged();

      notifyDataSetChanged()

      通知附加的观察者底层数据已更改,任何反映数据集的视图都应自行刷新。

      示例代码

      CustomAdapter adapter = new CustomAdapter(this, contacts);
      adapter.notifyDataSetChanged();
      

      在您的代码中

      @Override
      protected void onResume() {
         super.onResume();
         //Creation de ladapter
         contacts.clear();
         db = new ContactDatabase(this);
         contacts.addAll(db.getData());
         adapter.notifyDataSetChanged();
      }
      

      【讨论】:

      • adapter.notifyDataSetChanged(); ,adapter 是红色的,我想从 CustomAdapter 类中重新调用
      【解决方案3】:

      使用

      CustomAdapter adapter = new CustomAdapter ():
      adapter.notifyDataSetChanged();
      

      您在 listview 中添加或删除的任何位置

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多