java - ListView 中的按钮每个项目布局

标签 java android listview

我有一个 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文件对应的删除按钮时,会弹出toast,并且文件名与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);

最佳答案

我认为问题在于您的 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定为最终版本并从中获取文件名即可。

关于java - ListView 中的按钮每个项目布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21046646/

相关文章:

java - 以编程方式设置 View 的重力

java - 日历 : don't allow past timestamp

android - 自定义微调器不调用自定义 ListView ?

Android - 如何遍历 ListView ?

java - 为什么调用 get(int) 后 java.util.calendar 对象的值会发生变化

java - 如何获取外部可移动存储路径(micro SD卡)

android - 如何在我的 xml 文件中显示自定义 View ?

java - 加载 *.so 文件到 Websphere

java - 配置 ant 以运行单元测试。图书馆应该在哪里?类路径应该如何配置?避免 ZipException

android - ArrayAdapter - 获取列表项的给定资源 ID