【问题标题】:Update Listitem Textview on click of Listitem Button in Listview custom adapter单击 Listview 自定义适配器中的 Listitem 按钮更新 Listitem Textview
【发布时间】:2018-05-21 13:10:46
【问题描述】:

我有一个带有文本视图和按钮的列表视图。

当在列表视图中单击按钮时,我需要更新文本视图,并隐藏该按钮。

当我单击按钮时,它会更新 textview 值。但是当我向下滚动并向上移动时,textview 内容会变回之前的值,并且按钮是可见的。

Customadapter.java

public class CustomAdapter extends BaseAdapter {
    ArrayList cusList = new ArrayList();
    LayoutInflater inflater;
    Context context;

    public BookAdapter(Context context, ArrayList cusList) {
        this.cusList = cusList;
        this.context = context;
        inflater = LayoutInflater.from(this.context);
    }

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

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder viewHolder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list, parent, false);
            viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        Bookdata data = (Bookdata) getItem(position);
        viewHolder.mytv.setText(data.getName());

        viewHolder.mybtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                v.setVisibility(View.GONE);
                viewHolder.setText("Clicked");
            }
        });

        return convertView;
    }

    private class ViewHolder {
        TextView mytv;
        Button mybtn;

        public ViewHolder(View item) {
            mytv = (TextView)item.findViewById(R.id.mytv);
            mybtn = (Button)item.findViewById(R.id.mybtn);
        }
    }
}

Bookdata.java

public class Bookdata {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

列表视图代码:

ListView books= (ListView) findViewById(R.id.books);
ArrayList bookList = new ArrayList();
for (int i = 0; i < 10; i++) {
    Bookdata data = new Bookdata();
    data.setName("position "+i);
    bookList.add(data);
}
CustomAdapter allbookAda= new CustomAdapter(context, bookList);
books.setAdapter(allbookAda);
allbookAda.notifyDataSetChanged();

【问题讨论】:

    标签: android listview android-adapter baseadapter


    【解决方案1】:

    为每个列表项维护一个标志,以检查哪个列表项已更新。

    基本上在你的模型类中取一个标志值。

    public class Bookdata {
    private String name;
    private boolean flag;
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public boolean isFlag() {
        return flag;
    }
    
    public void setFlag(boolean flag) {
        this.flag = flag;
    }
    

    }

    在您的 getview 方法中添加以下更改

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder viewHolder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list, parent, false);
            viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
    
        Bookdata data = (Bookdata) getItem(position);
        viewHolder.mytv.setText(data.getName());
    
        if(data.getFlag){
       viewHolder.mybtn.setVisibility(View.GONE);
        }
    
        viewHolder.mybtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                v.setVisibility(View.GONE);
                viewHolder.setText("Clicked");
                cusList.get(position).setFlag(true);
    
            }
        });
    
        return convertView;
    }
    

    【讨论】:

    • 感谢您的回复。你能给我一个示例代码吗?
    【解决方案2】:

    这是一种常见的行为,因为 listview 使用回收的视图,上面的答案是正确的,但我更喜欢使用 DataBinding 的更简洁的方法

    【讨论】:

      猜你喜欢
      • 2015-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多