Reputation: 1375
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
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
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
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
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