【问题标题】:How to set listview button text according to the position?如何根据位置设置listview按钮文本?
【发布时间】:2013-07-01 08:39:35
【问题描述】:

我有一个 listview 有 20 个项目。在列表视图的每一行中,都有一个Button。我想根据位置改变Button文本。

  1. 如果位置为 2 和 3,则按钮文本将为“已邀请”。
  2. 如果位置是 5 和 8,按钮文本将为“已发送”。
  3. 对于所有其他位置,按钮文本应为“邀请”。

奇怪的问题是当我滚动时,文本被交换了。

按照我迄今为止的尝试,

public class MyAdapter extends BaseAdapter {

    private Activity activity;
    private String[] data;
    private static LayoutInflater inflater=null;
    public ImageLoader imageLoader; 

    public MyAdapter(Activity a, String[] d) {
        activity = a;
        data=d;
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        imageLoader=new ImageLoader(activity.getApplicationContext());
    }

    public int getCount() {
        return data.length;
    }

    public Object getItem(int position) {
        return position;
    }

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

    public View getView(int position, View convertView, ViewGroup parent) {
        View vi=convertView;
        if(convertView==null)
            vi = inflater.inflate(R.layout.item, null);

        Button text=(Button)vi.findViewById(R.id.text);;
        ImageView image=(ImageView)vi.findViewById(R.id.image);
        Log.i("POSITION:", ""+position);
        if(position==2 || position==3)
        text.setText("Invited");
        if(position==5 || position==8)
        {
            text.setText("Sent");
        }

        imageLoader.DisplayImage(data[position], image);
        return vi;
    }
}

【问题讨论】:

  • 那么你的问题是什么?
  • 问题是当我滚动时,文本被分配给列表视图中存在的其他一些按钮。

标签: android android-listview android-button


【解决方案1】:

把逻辑改成这样:

if (position==2 || position==3) {
    text.setText("Invited");
} 
else if (position==5 || position==8) {
    text.setText("Sent");
}
else {
    text.setText("Invite");
}

由于视图回收,如果没有后备“else”,您将在错误的行中获得错误的文本。

【讨论】:

  • 那么在这种情况下,除了位置 5 和 8,其他按钮将被分配一个“邀请”文本。
  • 2 和 3 将获得“邀请”,5 和 8 将获得“发送”,其余的将获得“邀请”。这是你要求的对吗?
  • 是的。我问这个问题真的很傻。实际上这个要求是一个大而复杂的项目的一部分,为了简单起见,我问了这个问题。无论如何你的回答对于这个问题是可以接受的。谢谢很多:)
  • 您能否告诉我为什么当我在 else if 条件中添加额外的行时您的答案不起作用。我添加了“text.setBackgroundResource(R.drawable.icon);”
【解决方案2】:

 else
    {
        text.setText("Invite");
    }

之后

if(position==5 || position==8)

【讨论】:

  • 按钮中需要 3 个不同的文本。您的解决方案仅适用于 2 个文本。
  • 可能发生在你的代码中..你忘了把 { } 放在你的第一个 if Condition..if(position==2 || position==3) text.setText("Invited ");
【解决方案3】:
 public View getViewByPosition(int pos, ListView listView) {
    final int firstListItemPosition = listView.getFirstVisiblePosition();
    final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;

    if (pos < firstListItemPosition || pos > lastListItemPosition ) {
        return listView.getAdapter().getView(pos, null, listView);
    } else {
        final int childIndex = pos - firstListItemPosition;
        return listView.getChildAt(childIndex);
    }
}
        //check above function return the view and now call the function  

               View v = getViewByPosition(position, list);
                LinearLayout vwParentRow1 = (LinearLayout) v;
                TextView btnChild1 = (TextView) vwParentRow1.getChildAt(0);
                String firstcolumn = btnChild1.getText().toString();

//firstcolumn变量根据列表视图的位置存储第一列的值

【讨论】:

  • 考虑添加一些解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-24
  • 2018-01-09
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
相关资源
最近更新 更多