2014-01-10 2 views
0

У меня есть listview, и я заполняю этот вид списка из 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 отличается от имени файла, которое я вижу на экране. Для бывших: у меня есть 5 файлов с именами

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

и теперь, когда я нажимаю кнопку, соответствующую файлу referesh.png всплывающие окна тоста удалить и в том, что имя файла отличается от referesh.png.

как решить эту проблему.

правок:

Это как настроить этот адаптер

   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. yes fPOJO - глобальная переменная. Список массивов - это список этих объектов – user123

ответ

1

Я думаю, что проблема с вашей fPOJO переменной, когда onClick называется это может иметь разное значение, потому что после каждого 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

изготовление держателя окончательный разрешенный вопрос. Можете ли вы объяснить это, я имею в виду, как fPOJO изменился, когда вызывается кнопка onClickListner. – user123

0

Вы сохраняете свой элемент списка в держателе, это ваша проблема, адаптер ListView создает столько конверсий, сколько необходимо для заполнения экрана, поэтому, если у вас есть список из 10+ элементов, только несколько будут добавлены в строку.

Прежде всего, не сохраняйте свой элемент списка в держателе, вы получили метод адаптера под названием getItem(positoin), чтобы получить его.

В вашем магазине видят только ссылки на макеты (TextView, Buttons и т. Д.) И (if(row == null) вызывают findViewById на них и setTag.

Затем установите текст, слушатель за пределами, если заявления, например, так:

@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; 
} 

Также вы можете сделать некоторый код оптимализацию, например, не инициализирует LayoutInflater в getView() методе, вы можете сделать это в адаптере Constructor

Смежные вопросы