简体   繁体   English

ListView中的按钮查看每个项目的布局

[英]Buttons in ListView each item layout

I have a listview and I am populating that list view from a ArrayList of custom objects. 我有一个列表视图,我正在从自定义对象的ArrayList填充该列表视图。 This is the custom adapter code. 这是自定义适配器代码。

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

There are two buttons one for file delete and other for file download. 有两个按钮,一个用于文件删除,另一个用于文件下载。 I have implemented on click listeners for these two buttons. 我已经为这两个按钮实现了点击侦听器。 The problem is when I click any button the fileName in the Toast message is different from the file name that I see on the screen display. 问题是当我单击任何按钮时,Toast消息中的fileName与我在屏幕显示中看到的文件名不同。 For ex: I have 5 files with names 例如:我有5个文件的名称

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

and now when I click delete button corresponding to referesh.png file the toast pop ups and in that the file name is different than referesh.png. 现在,当我单击与Referesh.png文件相对应的删除按钮时,将弹出吐司,并且文件名与Referesh.png不同。

how to resolve this issue. 如何解决这个问题。

EDITS: EDITS:

This is how I set up this adapter 这就是我设置此适配器的方式

             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);

I think the problem is with your fPOJO variable when onClick is called it may have different value because after every getView you're changing it's value. 我认为问题在于您的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;
}

Just make holder final and get you're file name from it. 只需将holder最终文件,即可从中获得文件名。

You store your list item in holder, this is your problem, ListView adapter creates as much convertViews as needed to fill the screen so if you have list of 10+ elements, only few will be added to row. 您将列表项存储在holder中,这是您的问题,ListView适配器会根据需要创建尽可能多的convertViews来填充屏幕,因此,如果您有10多个元素的列表,则只会将很少的元素添加到行中。

First of all don't store your list element in holder, you gave adapter method called getItem(positoin) to get it. 首先,不要将列表元素存储在holder中,而是使用了名为getItem(positoin)适配器方法来获取它。

In your holder view store only references to layout views (TextView, Buttons etc) and (if(row == null) call findViewById on them and setTag. 在您的所有者视图存储中,仅引用布局视图(TextView,Button等),并且(if(row == null)调用setViewById和setTag。

Then set text, listeners outside the if statement, like so: 然后在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;
}

Also you can do some code optimalization, for example don't initialize LayoutInflater in getView() method, you can do it in adapter Constructor 您还可以进行一些代码优化,例如,不要在getView()方法中初始化LayoutInflater,可以在适配器Constructor

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM