繁体   English   中英

Android:刷新ListView不起作用

[英]Android : Refresh ListView not working

我知道有很多关于这个问题的讨论,但是我的问题尚未解决。 按照标题,ListView不会用代码刷新

notifyDataSetChanged();

这是来自main.activity

verticalButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent;
            intent = new Intent(getApplicationContext(),verticalActivity.class);
            intent.putExtra("table","slide_vertical");
            intent.putExtra("pathConf","vertical");
            startActivity(intent);
        }
    });

这是用于verticalActivity.class

public class verticalActivity extends Activity {
private String tableActivity;
private String pathConf;
listAdapter adapter;
ArrayList<listActivity> items;
@Override
public void onCreate(Bundle savedInstaceState){
    super.onCreate(savedInstaceState);
    setContentView(R.layout.slidevertical);
    Intent intent = getIntent();
    String thisNewIntent = intent.getStringExtra("table");
    String thisNewPathConf = intent.getStringExtra("pathConf");
    this.tableActivity = thisNewIntent;
    this.pathConf = thisNewPathConf;
    DatabaseAdapter db = new DatabaseAdapter(getApplicationContext());
    try {
        db.createDataBase();
    } catch (IOException e) {
        e.printStackTrace();
    }
    db.openDataBase();
    this.items = db.getItem(thisNewIntent);
    final ListView obj = (ListView)findViewById(R.id.listvertical);
    adapter = new listAdapter(this,items,tableActivity);
    obj.setAdapter(adapter);
    db.close();
    obj.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Object o = obj.getItemAtPosition(position);
            listActivity getObject = (listActivity) o;
            Intent intent = new Intent(getApplicationContext(), viewItemAct.class);
            intent.putExtra("type", "image");
            intent.putExtra("data", getObject.getPath());
            startActivity(intent);
            //Toast.makeText(verticalActivity.this,"Data = "+getObject.getPath(),Toast.LENGTH_LONG).show();

        }
    });
 }
public void refreshList(){
adapter.notifyDataSetChanged();
}
}

对于listAdapter.activity

public class listAdapter extends BaseAdapter {
//private Context context;
private ArrayList<listActivity> itemList;
private LayoutInflater layoutInflater;
private String tableName;
Context myContext;
private Activity activity;
public listAdapter(Context context,ArrayList<listActivity> results,String tableName){
    this.itemList = results;
    layoutInflater = LayoutInflater.from(context);
    this.tableName = tableName;
    this.myContext = context;
}

@Override
public int getCount() {
    return itemList.size();
}

@Override
public Object getItem(int position) {
    return itemList.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    final ViewHolder holder;
    //ViewGroup p = parent;
    if(convertView==null){
        //layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = layoutInflater.inflate(R.layout.listitem,null,false);
        holder = new ViewHolder();
        holder.title = (TextView)convertView.findViewById(R.id.title);
        holder.location = (TextView)convertView.findViewById(R.id.location);
        holder.date = (TextView)convertView.findViewById(R.id.date);
        holder.idItem = (TextView)convertView.findViewById(R.id.iditem);
        holder.listImage = (ImageView)convertView.findViewById(R.id.list_image);
        holder.buttonDelete = (Button)convertView.findViewById(R.id.delButton);
        holder.buttonDelete.setFocusable(false);
        holder.buttonDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String idString = holder.idItem.getText().toString();
                DatabaseAdapter db = new DatabaseAdapter(myContext);
                try {
                    db.createDataBase();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                db.openDataBase();
                db.deleteData(idString,tableName);

                ((verticalActivity)activity).refreshList();

            }
        });
        convertView.setTag(holder);
    }
    else{
        holder = (ViewHolder)convertView.getTag();
    }

    int id_ = itemList.get(position).getId();
    //String id__ = toString(id_);
    holder.idItem.setText(String.valueOf(id_));
    Uri uri = Uri.parse(itemList.get(position).getPath());
    holder.listImage.setImageURI(uri);
    String[] splitLocation = itemList.get(position).getPath().split("/");
    String nameFile = splitLocation[splitLocation.length-1];
    holder.title.setText(nameFile);
    holder.location.setText(itemList.get(position).getPath());
    holder.date.setText(itemList.get(position).getDate());
    return convertView;
}

static class ViewHolder {
    TextView title;
    TextView location;
    TextView date;
    TextView idItem;
    ImageView listImage;
    Button buttonDelete;
}
}

从上面的代码中,有一个按钮可以执行从数据库中删除数据的操作,因为已经可以从数据库中删除数据,但是刷新ListView总是失败。 如果我的代码有问题? 有人能帮我吗?

感谢您的帮助。 对于麻烦,我有一个小解决方案。 我只是从ArrayList <>刷新项目列表。

public void refreshList(){ DatabaseAdapter db = new DatabaseAdapter(getApplicationContext()); try { db.createDataBase(); } catch (IOException e) { e.printStackTrace(); } db.openDataBase(); items.clear(); items.addAll(db.getItem(tableActivity)); adapter.notifyDataSetChanged(); }

非常感谢你 :)

在由Contect插入的listAdapter构造函数中通过活动

public listAdapter(Activity context,ArrayList<listActivity> results,String tableName){
    this.itemList = results;
    layoutInflater = LayoutInflater.from(context);
    this.tableName = tableName;
    this.activity = context;
    this.myContext = activity.getApplicationContext();
}

并在getView()方法中设置Button Id

 holder.buttonDelete.setId(position);

Button的onClick()放置以下代码

activity.runOnUiThread(new Runnable() {

@Override
    public void run() {
    System.out.println("Deleted Id "+v.getId());
    itemList.remove(v.getId());
    System.out.println("Refresh the list Item ");
    notifyDataSetChanged();                             
 }
});

这将删除您的项目。 如果您想要其他机制来处理您的列表视图

点击这里!

您有一个类变量Activity活动,并且您永远不会在任何地方对其进行初始化。要调用方法刷新列表,您需要在通过适配器构造函数传递的上下文中调用它。

((verticalActivity)context).refreshList();

您只从db中删除,而不从itemList中删除。

使用itemList.remove(position)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM