Prasad
Prasad

Reputation: 1375

Customized listview for dispaly files from sdcard

I am using Customized listview to list files from SDcard with two buttons in each row. Below is my code.

public class SDcardFiles extends BaseAdapter{

    private ArrayList<File> mSdFilesList;
    private LayoutInflater mInflator;
    File myfilename;

    public SDcardFiles(File filename){

      this.myfilename = filename;
      mSdFilesList = new ArrayList<File>();
      mInflator = FileList.this.getLayoutInflater();

      File list[] = myfilename.listFiles();

    for( int i=0; i< list.length; i++)
      {
      File f = list[i].getAbsoluteFile();
      mSdFilesList.add(f);      
     }      
    }    

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

        }

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

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

      @Override
     public View getView(int position, View view, ViewGroup parent) {
    ViewHolder viewHolder;
     if (view == null) {
       view = mInflator.inflate(R.layout.listitem_sdfiles, null);
       viewHolder = new ViewHolder();
       viewHolder.fileName = (TextView)view.findViewById(R.id.file_name);
       viewHolder.bt_encrypt = (Button)view.findViewById(R.id.encrypt);
       viewHolder.bt_decrypt = (Button)view.findViewById(R.id.decrypt);
       view.setTag(viewHolder);

          } else {
                 viewHolder = (ViewHolder) view.getTag();
          }

        mFileName = mSdFilesList.get(position);
        mFN = mFileName.getName();
        System.out.println("filename in position====>"+mFN);
        if(mFN != null && mFN.length() > 0){
         viewHolder.fileName.setText(mFN);
         }

    viewHolder.bt_encrypt.setOnClickListener(new OnClickListener() {
    @Override
     public void onClick(View v) {
        System.out.println("inside encryption====>"+mFN);
         }
                });     

Here I am able to get a list of files from SDcard of particular folder and two buttons in each row. I am also getting name of the file from position of the list(i.e Line number : 35). but problem is when i clicked a button of particular row it is always printing last row file name but not that row which i pressed button. Can anyone help me.

Thanks

Upvotes: 0

Views: 110

Answers (4)

A B
A B

Reputation: 338

 @Override
    public View getView(int position, View view, ViewGroup parent) {
    ViewHolder viewHolder;
   if (view == null) 
  {
      view = mInflator.inflate(R.layout.listitem_sdfiles, null);
      viewHolder = new ViewHolder();
      viewHolder.fileName = (TextView)view.findViewById(R.id.file_name);
      viewHolder.bt_encrypt = (Button)view.findViewById(R.id.encrypt);
      viewHolder.bt_decrypt = (Button)view.findViewById(R.id.decrypt);
      view.setTag(viewHolder);

      } else {
              viewHolder = (ViewHolder) view.getTag();
            }

      mFileName = mSdFilesList.get(position);
      mFN = mFileName.getName();
      System.out.println("filename in position====>"+mFN);
      if(mFN != null && mFN.length() > 0)
      {
        viewHolder.fileName.setText(mFN);

        viewHolder.bt_encript.setTag(mFN);
   }

 viewHolder.bt_encrypt.setOnClickListener(new OnClickListener() {
     @Override
     public void onClick(View v) {

         if(view.getTag()!= null)
         {
            String fileName =  (String) view.getTag();
            System.out.println("inside encryption====>"+fileName);
         }
     }


  });  

Upvotes: 1

Xcihnegn
Xcihnegn

Reputation: 11597

In your button click listener, should be:

viewHolder.bt_encrypt.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
        ViweHolder holder = (ViewHolder)v.getTag();
        System.out.println("inside encryption====>"+ holder.fileName.getText());
   }

}); 

Upvotes: 0

Rahul Sharma
Rahul Sharma

Reputation: 6169

in getView() method use:

viewHolder.bt_encrypt = (Button)view.findViewById(R.id.encrypt);
viewHolder.bt_encript.setTag(position);

and in onClick use:

@Override
    public void onClick(View view) {
        String mStringData = (String) view.getTag();

Upvotes: 2

Oleksii K.
Oleksii K.

Reputation: 5419

You shouldn't set OnClickListener inside of getView() method, use method ListView.setOnItemClickListener() instead.

In the interface implementation you can get the data item by position and show corresponding data for clicked item.

Upvotes: 0

Related Questions