如何在Android中使用baseadapter刷新自定义列表视图自定义、视图、如何在、列表

2023-09-13 00:33:52 作者:五爪漣心*

先生,用baseadapter我怎么能刷新我的自定义列表视图。我不知道该怎么放,或者将它放在我的code。请帮助我。在此先感谢

 公共类EditDetails延伸活动{
公共字符串nameChanged;
公共字符串numChanged;
公共字符串名称;
公共字符串NUM;
公共无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.editdetails);
    最后的EditText sqlName =(EditText上)findViewById(R.id.editName);
    最后的EditText sqlNumber =(EditText上)findViewById(R.id.editNumber);
    NAME = CustomListView.name;
    NUM = CustomListView.number;
    按钮bUpdate =(按钮)findViewById(R.id.editUpdate);
    按钮bView =(按钮)findViewById(R.id.editView);
    sqlName.setText(名称);
    sqlNumber.setText(NUM);

    bUpdate.setOnClickListener(新OnClickListener(){

        公共无效的onClick(查看为arg0){
            nameChanged = sqlName.getText()的toString()。
            numChanged = sqlNumber.getText()的toString()。
            GroupDb信息=新GroupDb(EditDetails.this);
            info.open();
            长ROWID = info.getRowId(名称,NUM);
            info.updateNameNumber(ROWID,nameChanged,numChanged);
            ArrayList的<联系与GT;的SearchResult = info.getView();
            MyCustomBaseAdapter MCBA =新MyCustomBaseAdapter(EditDetails.this,SearchResult所);
            Toast.makeText(getApplicationContext(),更新成功!,Toast.LENGTH_LONG).show();
            info.close();
            }
        });
    bView.setOnClickListener(新OnClickListener(){

        公共无效的onClick(查看为arg0){
            意向意图=新的意图();
            intent.setClass(EditDetails.this,CustomListView.class);

            startActivityForResult(意向,0);
            }
        });
}

}
 

下面是我显示我的列表视图

 公共类CustomListView延伸活动{
最终的上下文语境=这一点;
公共静态字符串名称;
公共静态串号;
@覆盖
公共无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.main);
    GroupDb信息=新GroupDb(本);
    info.open();
    ArrayList的<联系与GT;的SearchResult = info.getView();


    最终的ListView LV =(ListView控件)findViewById(R.id.srListView);
    lv.setAdapter(新MyCustomBaseAdapter(这一点,SearchResult所));
    info.close();

    lv.setOnItemClickListener(新OnItemClickListener(){

        公共无效onItemClick(适配器视图<>一种,视图V,INT位置,长的id){
            // TODO自动生成方法存根
            对象o = lv.getItemAtPosition(位置);
            最后联系fullObject =(联系)O;
            AlertDialog.Builder alertDialogBu​​ilder =新AlertDialog.Builder(上下文);
            alertDialogBu​​ilder
            .setMessage(选择操作)
            .setCancelable(假)
            .setPositiveButton(编辑,新DialogInterface.OnClickListener(){
                公共无效的onClick(DialogInterface对话框,INT ID){
                    Toast.makeText(getApplicationContext(),编辑,Toast.LENGTH_LONG).show();
                    名称= fullObject.getName();
                    数= fullObject.getPhoneNumber();
                    意图contactIntent =新的意向书(myfolder.proj.EDITDETAILS);
                    startActivity(contactIntent);
                }
              })
 

和这里是我的baseadapter类

 公共类MyCustomBaseAdapter扩展了BaseAdapter {
私有静态的ArrayList<联系与GT; sea​​rchArrayList;

私人LayoutInflater mInflater;

公共MyCustomBaseAdapter(上下文的背景下,ArrayList的<联系与GT;的结果){
    sea​​rchArrayList =结果;
    mInflater = LayoutInflater.from(上下文);
}

公众诠释getCount将(){
    返回searchArrayList.size();
}

公共对象的getItem(INT位置){
    返回searchArrayList.get(位置);
}

众长getItemId(INT位置){
    返回的位置;
}

公共查看getView(INT位置,查看convertView,ViewGroup中父){
    ViewHolder持有人;
    如果(convertView == NULL){
        convertView = mInflater.inflate(R.layout.custom_row_view,NULL);
        持有人=新ViewHolder();
        holder.txtName =(TextView中)convertView.findViewById(R.id.name);

        holder.txtPhone =(TextView中)convertView.findViewById(R.id.phone);

        holder.status =(TextView中)convertView.findViewById(R.id.status);
        convertView.setTag(保持器);
    } 其他 {
        支架=(ViewHolder)convertView.getTag();
    }

    holder.txtName.setText(searchArrayList.get(位置).getName());

    holder.txtPhone.setText(searchArrayList.get(位置).getPhoneNumber());

    holder.status.setText(searchArrayList.get(位置).getStatus());

    返回convertView;
}

静态类ViewHolder {
    TextView的txtName的;
    TextView的txtPhone;
    TextView的状态;
}
}
 
Android中BaseAdapter的用法分析与理解

解决方案

两种选择:要么守住了的ArrayList ,你传递给构造函数,因此您可以参考后来修改实际列表数据(因为该列表不复制,修改适配器以外的数据仍然更新该指针适配器正在引用),或重写适配器以允许列表重置为另一目的。

在这两种情况下,后的ArrayList 已经改变了,你必须调用 notifyDataSetChanged()来更新你的的ListView 的变化。这可以内部或适配器外面来完成。因此,例如:

 公共类MyCustomBaseAdapter扩展了BaseAdapter {
    //提示:不要让这个静态的,这只是一个坏主意
    私人的ArrayList<联系与GT; sea​​rchArrayList;

    私人LayoutInflater mInflater;

    公共MyCustomBaseAdapter(上下文的背景下,ArrayList的<联系与GT; initialResults){
        sea​​rchArrayList = initialResults;
        mInflater = LayoutInflater.from(上下文);
    }

    公共无效updateResults(ArrayList中<联系与GT;的结果){
        sea​​rchArrayList =结果;
        //触发列表更新
        notifyDataSetChanged();
    }

    / * ...您的code,我没能复制过来休息... * /
}
 

心连心

sir, how can i refresh my custom listview using baseadapter. i don't know what to place, or where to place it in my code. please help me. thanks in advance

public class EditDetails extends Activity{
public String nameChanged;
public String numChanged;
public String name;
public String num;
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.editdetails);
    final EditText sqlName = (EditText)findViewById(R.id.editName);
    final EditText sqlNumber = (EditText)findViewById(R.id.editNumber);
    name = CustomListView.name;
    num = CustomListView.number;
    Button bUpdate = (Button)findViewById(R.id.editUpdate);
    Button bView = (Button)findViewById(R.id.editView);
    sqlName.setText(name);
    sqlNumber.setText(num);

    bUpdate.setOnClickListener(new OnClickListener() {

        public void onClick(View arg0) {
            nameChanged = sqlName.getText().toString();
            numChanged = sqlNumber.getText().toString();
            GroupDb info = new GroupDb(EditDetails.this);
            info.open();
            long rowid = info.getRowId(name, num);
            info.updateNameNumber(rowid, nameChanged, numChanged);
            ArrayList<Contact> searchResults = info.getView();
            MyCustomBaseAdapter mcba = new MyCustomBaseAdapter(EditDetails.this, searchResults);
            Toast.makeText(getApplicationContext(), "Update Successful!", Toast.LENGTH_LONG).show();
            info.close();
            }
        });
    bView.setOnClickListener(new OnClickListener() {

        public void onClick(View arg0) {
            Intent intent = new Intent();
            intent.setClass(EditDetails.this, CustomListView.class);

            startActivityForResult(intent, 0);
            }
        });
}

}

here is where i displayed my listview

public class CustomListView extends Activity {
final Context context = this;
public static String name;
public static String number;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    GroupDb info = new GroupDb(this);
    info.open();
    ArrayList<Contact> searchResults = info.getView();


    final ListView lv = (ListView) findViewById(R.id.srListView);
    lv.setAdapter(new MyCustomBaseAdapter(this, searchResults));
    info.close();

    lv.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> a, View v, int position, long id) {
            // TODO Auto-generated method stub
            Object o = lv.getItemAtPosition(position);
            final Contact fullObject = (Contact)o;
            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
            alertDialogBuilder
            .setMessage("Select action")
            .setCancelable(false)
            .setPositiveButton("Edit", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog,int id) {
                    Toast.makeText(getApplicationContext(), "Edit ", Toast.LENGTH_LONG).show();
                    name = fullObject.getName();
                    number = fullObject.getPhoneNumber();
                    Intent contactIntent = new Intent("myfolder.proj.EDITDETAILS");
                    startActivity(contactIntent);
                }
              })

and here is my baseadapter class

public class MyCustomBaseAdapter extends BaseAdapter {
private static ArrayList<Contact> searchArrayList;

private LayoutInflater mInflater;

public MyCustomBaseAdapter(Context context, ArrayList<Contact> results) {
    searchArrayList = results;
    mInflater = LayoutInflater.from(context);
}

public int getCount() {
    return searchArrayList.size();
}

public Object getItem(int position) {
    return searchArrayList.get(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.custom_row_view, null);
        holder = new ViewHolder();
        holder.txtName = (TextView) convertView.findViewById(R.id.name);

        holder.txtPhone = (TextView) convertView.findViewById(R.id.phone);

        holder.status = (TextView) convertView.findViewById(R.id.status);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.txtName.setText(searchArrayList.get(position).getName());

    holder.txtPhone.setText(searchArrayList.get(position).getPhoneNumber());

    holder.status.setText(searchArrayList.get(position).getStatus());

    return convertView;
}

static class ViewHolder {
    TextView txtName;
    TextView txtPhone;
    TextView status;
}
}

解决方案

Two options: either hold onto the reference for the ArrayList that you passed into the constructor so you can modify the actual list data later (since the list isn't copied, modifying the data outside the Adapter still updates the pointer the Adapter is referencing), or rewrite the Adapter to allow the list to be reset to another object.

In either case, after the ArrayList has changed, you must call notifyDataSetChanged() to update your ListView with the changes. This can be done inside or outside the adapter. So, for example:

public class MyCustomBaseAdapter extends BaseAdapter {
    //TIP: Don't make this static, that's just a bad idea
    private ArrayList<Contact> searchArrayList;

    private LayoutInflater mInflater;

    public MyCustomBaseAdapter(Context context, ArrayList<Contact> initialResults) {
        searchArrayList = initialResults;
        mInflater = LayoutInflater.from(context);
    }

    public void updateResults(ArrayList<Contact> results) {
        searchArrayList = results;
        //Triggers the list update
        notifyDataSetChanged();
    }

    /* ...The rest of your code that I failed to copy over... */
}

HTH