如何在动态创建的文本框上获取Click Listener

时间:2017-01-21 15:11:32

标签: android performance android-layout listview android-fragments

我收到了创建2 text boxes的回复,我收到了两个视图的网址和显示文字,我将其添加到ArrayList。现在我需要在它们上添加点击监听器。我写了以下代码。

for(int i=0; i<tvArrayList.size(); i++){

    TextView textView;
    textView= tvArrayList.get(i);


    textView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i= new Intent(MavsV2PromoActivity.this, DynamicWebView.class);
            i.putExtra("URL", URL_LINK);
            i.putExtra("VIEW_NAME",VIEW_NAME);
            startActivity(i);
        }
    });
}

问题是,它将相同的URL值应用于两个视图,无论是单击第一个还是最后一个文本视图,它都会从列表中打开最后text view的URL。

的TextView

  ArrayList<TextView> tvArrayList= new ArrayList<TextView>();

    for(int i=0; i<linksDataList.size(); i++){


        URL_LINK= linksDataList.get(i).getLinkURL();
        VIEW_NAME= linksDataList.get(i).getName();

        TextView textView =new TextView(this);
        textView.setText(linksDataList.get(i).getName());

        if(linksDataList.size() != i) {
            textView.append(" | ");
        }

        ll_links.addView(textView);



        tvArrayList.add(textView);

    }

3 个答案:

答案 0 :(得分:1)

这不是你需要做的更多吗?什么是“tvArrayList”?您需要在循环中生成textviews。

for(int i=0; i<myResults.size(); i++){

    TextView textView = new TextView(this);
    tvArrayList.add(textView);

    textView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i= new Intent(MavsV2PromoActivity.this, DynamicWebView.class);
            i.putExtra("URL", URL_LINK);
            i.putExtra("VIEW_NAME",VIEW_NAME);
            startActivity(i);
        }
    });
}

答案 1 :(得分:1)

您为两个按钮添加了相同的网址。当第一个循环结束时,URL_LINK(我假设它是一个类成员,虽然大写通常用于常量)具有最后一个值。

您可以将OnClickListener创建放入第一个循环:

 ArrayList<TextView> tvArrayList= new ArrayList<TextView>();

for(int i=0; i<linksDataList.size(); i++){


    String urlLink = linksDataList.get(i).getLinkURL();
    String viewName = linksDataList.get(i).getName();

    TextView textView =new TextView(this);
    textView.setText(linksDataList.get(i).getName());

    if(linksDataList.size() != i) {
        textView.append(" | ");
    }

    ll_links.addView(textView);

    textView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i= new Intent(MavsV2PromoActivity.this, DynamicWebView.class);
            i.putExtra("URL", URL_LINK);
            i.putExtra("VIEW_NAME",VIEW_NAME);
            startActivity(i);
        }
    });

    tvArrayList.add(textView);
}

答案 2 :(得分:1)

如果您需要将字段附加到textView(在本例中为URL_LINK和VIEW_NAME),则可以通过扩展一个来创建自己的TextView类。

public class MyCustomTextView extends TextView {

    private String urlLink; //The fields required.
    private String viewName;

    //The getter and setter for each field.
    public String getUrlLink() {
        return urlLink;
    }

    public void setUrlLink(String urlLink) {
        this.urlLink = urlLink;
    }

    public String getViewName() {
        return viewName;
    }

    public void setViewName(String viewName) {
        this.viewName = viewName;
    }

    public MyCustomTextView(Context context) {
        super(context);
    }

    public MyCustomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyCustomTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

}

现在,您应该创建上面刚刚创建的CustomTextView,而不是创建TextView。

ArrayList<MyCustomTextView> tvArrayList= new ArrayList<>();

        for(int i=0; i<linksDataList.size(); i++){


            URL_LINK= linksDataList.get(i).getLinkURL();
            VIEW_NAME= linksDataList.get(i).getName();

            MyCustomTextView textView =new MyCustomTextView(this);
            textView.setUrlLink(URL_LINK); //Set fields here
            textView.setViewName(VIEW_NAME);
            textView.setText(linksDataList.get(i).getName());

            if(linksDataList.size() != i) {
                textView.append(" | ");
            }

            ll_links.addView(textView);



            tvArrayList.add(textView);

        }

每当您想要访问字段时,只需使用getter即可。在您的情况下,如果单击TextView。

for(int i=0; i<tvArrayList.size(); i++){

            final MyCustomTextView textView;
            textView= tvArrayList.get(i);


            textView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent i= new Intent(MavsV2PromoActivity.this, DynamicWebView.class);
                    i.putExtra("URL", textView.getUrlLink());
                    i.putExtra("VIEW_NAME",textView.getViewName());
                    startActivity(i);
                }
            });
        }