2014-01-10 83 views
0

我有一個列表視圖,我從填充自定義對象的一個​​ArrayList的是列表視圖。 這是自定義適配器代碼。按鈕ListView中的每個項目佈局

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     final int a=position; 


     FileHolder holder=null; 
     View row = convertView; 
     if(row==null) 
     { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(textViewResourceId, parent, false); 
      holder=new FileHolder(); 

      holder.file=files.get(position); 
      holder.deleteButton=(ImageButton) row.findViewById(R.id.deleteButton); 
      holder.downloadButton=(ImageButton) row.findViewById(R.id.downloadButton); 

      holder.deleteButton.setTag(holder.file); 
      holder.downloadButton.setTag(holder.file); 


      holder.fileName= (TextView) row.findViewById(R.id.fileName); 



      holder.fileName.setText(holder.file.getFileName()); 

     } 
     else 
     { 
      holder=(FileHolder) row.getTag(); 
     } 
     fPOJO=holder.file; 
     final AsyncCall call=new AsyncCall(); 

     holder.downloadButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       MODE=0; 
       //call.execute(MODE); 

      } 
     }); 

     holder.deleteButton.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Toast.makeText(getContext(), "Delete File "+(String.valueOf(a))+" "+fPOJO.getFileName(), Toast.LENGTH_LONG).show(); 
       MODE=1; 
       //call.execute(MODE); 

      } 
     }); 


     return row; 
    } 

    public static class FileHolder{ 
    FilesPOJO file; 
    TextView fileName; 
    ImageButton downloadButton; 
    ImageButton deleteButton; 
} 

有兩個按鈕一個用於文件刪除和其他文件下載。我已經實施了這兩個按鈕的點擊監聽器。問題是當我點擊任何按鈕時,Toast消息中的fileName與我在屏幕顯示中看到的文件名稱不同。對於例如:我有5個文件,其名稱

delete.png 
upload.png 
share.png 
referesh.png 
copy.png 

,現在當我點擊刪除與referesh.png文件敬酒彈出窗口按鈕,在文件名是不是referesh.png不同。

如何解決這個問題。

EDITS:

這是我建立這個適配器

   FilesAdapter adapter=new FilesAdapter(rootView.getContext(), R.layout.file_list_view_item_row, Application.files); 
      View header = (View) View.inflate(rootView.getContext(), R.layout.files_list_view_header_row, null); 
      fileListHeading.inflate(rootView.getContext(), R.layout.files_list_view_header_row, null); 
      filesListView.addHeaderView(header); 
      filesListView.setAdapter(adapter); 
+0

是你fPOJO全球性的? –

+0

@ A.S。是fPOJO是全局變量。 Array列表是這些對象的列表 – user123

回答

1

我認爲這個問題是您的fPOJOonClick被調用時,因爲以後每getView你可能有不同的價值變量改變它的價值。

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    final int a=position; 


    final FileHolder holder; 
    View row = convertView; 
    if(row==null) 
    { 
     LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
     row = inflater.inflate(textViewResourceId, parent, false); 
     holder=new FileHolder(); 

     holder.file=files.get(position); 
     holder.deleteButton=(ImageButton) row.findViewById(R.id.deleteButton); 
     holder.downloadButton=(ImageButton) row.findViewById(R.id.downloadButton); 

     holder.deleteButton.setTag(holder.file); 
     holder.downloadButton.setTag(holder.file); 


     holder.fileName= (TextView) row.findViewById(R.id.fileName); 



     holder.fileName.setText(holder.file.getFileName()); 

    } 
    else 
    { 
     holder=(FileHolder) row.getTag(); 
    } 

    final AsyncCall call=new AsyncCall(); 

    holder.downloadButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      MODE=0; 
      //call.execute(MODE); 

     } 
    }); 

    holder.deleteButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Toast.makeText(getContext(), "Delete File "+(String.valueOf(a))+" "+holder.fileName, Toast.LENGTH_LONG).show(); 
      MODE=1; 
      //call.execute(MODE); 

     } 
    }); 


    return row; 
} 

只是要holder決賽並獲得你從它的文件名。

+0

如何解決這個問題。 – user123

+0

如何解決什麼? – holtaf

+0

使持有人最終解決了問題。你能解釋一下,我的意思是當按鈕onClickListner被調用時fPOJO如何改變。 – user123

0

你存儲在你的持有人名單的項目,這是你的問題,ListView的適配器可根據需要創建以填滿屏幕,所以如果你有10+元素的列表中,只有少數會被添加到排之多convertViews。

首先,不要將您的列表元素存儲在持有人,你給叫getItem(positoin)得到它的適配器方法。

在您的持有者視圖存儲中,只有引用佈局視圖(TextView,Buttons等)和(if(row == null)在它們和setTag上調用findViewById。

然後設置文本,聽衆if語句外,像這樣:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    final int a=position; 


    FileHolder holder=null; 
    View row = convertView; 
    if(row==null) 
    { 
     LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
     row = inflater.inflate(textViewResourceId, parent, false); 
     holder=new FileHolder(); 

     holder.deleteButton=(ImageButton) row.findViewById(R.id.deleteButton); 
     holder.downloadButton=(ImageButton) row.findViewById(R.id.downloadButton); 

     holder.fileName= (TextView) row.findViewById(R.id.fileName); 

     row.setTag(holder); 

    } 
    else 
    { 
     holder=(FileHolder) row.getTag(); 
    } 

    fPOJO= getItem(position); 

    final AsyncCall call=new AsyncCall(); 

    holder.downloadButton.setOnClickListener(null); 
    holder.downloadButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      MODE=0; 
      //call.execute(MODE); 

     } 
    }); 

    holder.deleteButton.setOnClickListener(null); 
    holder.deleteButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Toast.makeText(getContext(), "Delete File "+(String.valueOf(a))+" "+fPOJO.getFileName(), Toast.LENGTH_LONG).show(); 
      MODE=1; 
      //call.execute(MODE); 

     } 
    }); 


    return row; 
} 

public static class FileHolder{ 
    TextView fileName; 
    ImageButton downloadButton; 
    ImageButton deleteButton; 
} 

你也可以做一些代碼optimalization,例如不getView()方法來初始化LayoutInflater,您可以在適配器Constructor

相關問題