2014-03-30 146 views
0

我知道這是討論這個問題很多,但我的問題還沒有解決。按照標題,ListView中不會與代碼Android:刷新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(); }

非常感謝你:)

回答

0

你有一個類變量活動活動,你永遠不會初始化它的任何地方...調用方法刷新列表,你需要調用它,你可以通過適配器構造函數傳遞的上下文中......

((verticalActivity)context).refreshList(); 
+1

這並不提供答案的問題。要批評或要求作者澄清,請在其帖子下方留言。 – Rico

+0

爲什麼?你讀過上面的代碼嗎?他有一個活動變量甚至沒有初始化... –

+0

你能詳細說明嗎?這是剛剛通過#1標記爲「低質量」 – Rico

0

你只是從數據庫中刪除而不是從itemList中刪除。

使用itemList.remove(position)

+0

是的,我知道,但我想,當數據刪除成功。 – ginc0de

+0

適配器基於itemList中的內容設置的ListView的內容刷新列表不是db。除非您重新初始化,否則從數據庫中刪除將不會更改itemList的內容。所以你必須調用db.deleteData(idString,tableName)之後的itemList.remove(position); – AnswerBot

1

在listAdapter構造insted的Contect的傳遞活性

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按鈕代替的()方法

holder.buttonDelete.setId(position); 

的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();        
} 
}); 

這將刪除您的項目。如果u想不同的機制來處理你的列表視圖

click Here!