缺少按钮滚动时在ListView [英] Buttons Missing When Scroll the ListView

查看:179
本文介绍了缺少按钮滚动时在ListView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我点击的ListView项,该特定项目按钮是可见的。当我滚动列表视图按钮都不见了。如何实现这一功能。什么是错在此请帮助我。谢谢

下面是我的code:

MainActivity.java

 公共类MainActivity延伸活动{    LV的ListView;
    查看SampleAdapter SA;
    ArrayList的<串GT;作为=新的ArrayList<串GT;();
    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);
        的for(int i = 0; I< 20;我++)
        {
            as.add(将String.valueOf(I));
        }
        LV =(ListView控件)findViewById(R.id.listView1);
        SA =新的查看SampleAdapter(MainActivity.this);
        lv.setAdapter(SA);        }
    类查看SampleAdapter扩展了BaseAdapter
    {        上下文CTX;
        按钮B;
        TextView的电视;
        LayoutInflater林;
        公共查看SampleAdapter(上下文CT){
            this.ctx =克拉;
        }        @覆盖
        公众诠释的getCount(){
            // TODO自动生成方法存根
            返回as.size();
        }        @覆盖
        公共对象的getItem(INT为arg0){
            // TODO自动生成方法存根
            返回将arg0;
        }        @覆盖
        众长getItemId(INT为arg0){
            // TODO自动生成方法存根
            返回将arg0;
        }        @覆盖
        公共查看getView(INT POS,查看ARG1,ARG2的ViewGroup){
            // TODO自动生成方法存根
            林=(LayoutInflater)ctx.getSystemService(LAYOUT_INFLATER_SERVICE);
            ARG1 = lin.inflate(R.layout.li,NULL);
            电视=(TextView中)arg1.findViewById(R.id.textView1);
            B =(按钮)arg1.findViewById(R.id.button1);
            tv.setText(as.get(POS));
            b.setText(as.get(POS));
            arg1.setOnClickListener(新OnClickListener(){                @覆盖
                公共无效的onClick(视图v){
                    按钮C =(按钮)v.findViewById(R.id.button1);
                    c.setVisibility(View.VISIBLE);
                }
            });
            返回ARG1;
        }    }
    }

activity_main.xml中

 < LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:layout_width =FILL_PARENT
    机器人:layout_height =FILL_PARENT>    < ListView控件
        机器人:ID =@ + ID / ListView1的
        机器人:layout_width =match_parent
        机器人:layout_height =WRAP_CONTENT
        机器人:layout_weight =1>
    < /&的ListView GT;< / LinearLayout中>

li.xml

 <?XML版本=1.0编码=UTF-8&GT?;
< LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:layout_width =match_parent
    机器人:layout_height =match_parent
    机器人:方向=垂直>    <的TextView
        机器人:ID =@ + ID / textView1
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:文字=TextView的/>    <按钮
        机器人:ID =@ + ID /按钮1
        风格=机器人:ATTR / buttonStyleSmall
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:知名度=隐形
        机器人:文字=按钮/>< / LinearLayout中>


解决方案

 安卓知名度=隐形

这使按钮不可见。

然后,你还要

  c.setVisibility(View.VISIBLE);

您需要了解的ListView回收的意见。所以,当你滚动因为观点被回收你的按钮不可见。

检查以下链接

ListView的回收机制如何工作

好检查这个例子非常类似于你

<一个href=\"http://stackoverflow.com/questions/20611123/listview-subobject-clickable-confilct/20612237#20612237\">ListView子对象可点击confilct

要解决,你可以使用一个模型类

Model类

 公共类模式{
INT知名度;
 字符串值;
公众诠释getVisibility(){
    返回知名度;
}
公共无效setVisibility(INT可见性){
    this.visibility =知名度;
}
公共字符串的getValue(){
    返回值;
}
公共无效的setValue(字符串值){
    THIS.VALUE =价值;
}}

MainActivity.java

 公共类MainActivity延伸活动{    LV的ListView;
    查看SampleAdapter SA;
    最终诠释visible1 = View.INVISIBLE;
    最终诠释visible2 = View.VISIBLE;
    ArrayList的&LT;模型与GT;作为=新的ArrayList&LT;模型与GT;();
    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);
        的for(int i = 0; I&LT; 20;我++)
        {
            型号型号=新模式();
            model.setValue(将String.valueOf(I));
            model.setVisibility(visible1);
            as.add(模型);
        }
        LV =(ListView控件)findViewById(R.id.listView1);
        SA =新的查看SampleAdapter(MainActivity.this);
        lv.setAdapter(SA);        }
    类查看SampleAdapter扩展了BaseAdapter
    {        上下文CTX;
        按钮B;
        TextView的电视;
        LayoutInflater林;
        公共查看SampleAdapter(上下文CT){
            this.ctx =克拉;
        }        @覆盖
        公众诠释的getCount(){
            // TODO自动生成方法存根
            返回as.size();
        }        @覆盖
        公共对象的getItem(INT为arg0){
            // TODO自动生成方法存根
            返回将arg0;
        }        @覆盖
        众长getItemId(INT为arg0){
            // TODO自动生成方法存根
            返回将arg0;
        }        @覆盖
        公共查看getView(INT POS,查看ARG1,ARG2的ViewGroup){
            // TODO自动生成方法存根
            林=(LayoutInflater)ctx.getSystemService(LAYOUT_INFLATER_SERVICE);
            ARG1 = lin.inflate(R.layout.fg,NULL);
            电视=(TextView中)arg1.findViewById(R.id.textView1);
            B =(按钮)arg1.findViewById(R.id.button1);
            tv.setText(as.get(POS).getValue());
            b.setText(as.get(POS).getValue());
            arg1.setTag(POS)
            b.setVisibility(as.get(POS).getVisibility());
            arg1.setOnClickListener(新OnClickListener(){                @覆盖
                公共无效的onClick(视图v){                    INT POS =(int)的v.getTag();
                    型号model = as.get(POS)
                    model.setVisibility(visible2);
                    SampleAdapter.this.notifyDataSetChanged();                }
            });
            返回ARG1;
        }    }
    }

对齐

您可以上下滚动和国家遗迹

when i click the listview item, that particular item button is Visible. when i scroll the listview the buttons are gone. how to implement this functionality. what is the wrong in this please help me. Thanks

Here is My Code:

MainActivity.java

public class MainActivity extends Activity {

    ListView lv;
    SampleAdapter sa;
    ArrayList<String> as=new ArrayList<String>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        for(int i=0;i<20;i++)
        {
            as.add(String.valueOf(i));
        }
        lv=(ListView)findViewById(R.id.listView1);
        sa=new SampleAdapter(MainActivity.this);
        lv.setAdapter(sa);

        }
    class SampleAdapter extends BaseAdapter
    {

        Context ctx;
        Button b;
        TextView tv;
        LayoutInflater lin;
        public SampleAdapter(Context ct) {
            this.ctx=ct;
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return as.size();
        }

        @Override
        public Object getItem(int arg0) {
            // TODO Auto-generated method stub
            return arg0;
        }

        @Override
        public long getItemId(int arg0) {
            // TODO Auto-generated method stub
            return arg0;
        }

        @Override
        public View getView(int pos, View arg1, ViewGroup arg2) {
            // TODO Auto-generated method stub
            lin=(LayoutInflater)ctx.getSystemService(LAYOUT_INFLATER_SERVICE);
            arg1=lin.inflate(R.layout.li, null);
            tv=(TextView)arg1.findViewById(R.id.textView1);
            b=(Button)arg1.findViewById(R.id.button1);
            tv.setText(as.get(pos));
            b.setText(as.get(pos));
            arg1.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    Button c=(Button)v.findViewById(R.id.button1);
                    c.setVisibility(View.VISIBLE);
                }
            });
            return arg1;
        }

    }
    }

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1" >
    </ListView>

</LinearLayout>

li.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

    <Button
        android:id="@+id/button1"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="invisible"
        android:text="Button" />

</LinearLayout>

解决方案

You have

android:visibility="invisible"

This makes the button not visible.

And then you have

c.setVisibility(View.VISIBLE);

You need to understand that listview recycles views. So when you scroll your Buttons become invisible because the views are recycled.

Check the below link

How ListView's recycling mechanism works

Well check this example which is very similar to yours

ListView subobject clickable confilct

TO fix you can use a Model class

Model class

public class Model {
int visibility;
 String value;


public int getVisibility() {
    return visibility;
}
public void setVisibility(int visibility) {
    this.visibility = visibility;
}
public String getValue() {
    return value;
}
public void setValue(String value) {
    this.value = value;
}

}

MainActivity.java

public class MainActivity extends Activity {

    ListView lv;
    SampleAdapter sa;
    final int visible1 = View.INVISIBLE;
    final int visible2 = View.VISIBLE;
    ArrayList<Model> as=new ArrayList<Model>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        for(int i=0;i<20;i++)
        {
            Model model  = new Model();
            model.setValue(String.valueOf(i));
            model.setVisibility(visible1);
            as.add(model);
        }
        lv=(ListView)findViewById(R.id.listView1);
        sa=new SampleAdapter(MainActivity.this);
        lv.setAdapter(sa);

        }
    class SampleAdapter extends BaseAdapter
    {

        Context ctx;
        Button b;
        TextView tv;
        LayoutInflater lin;
        public SampleAdapter(Context ct) {
            this.ctx=ct;
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return as.size();
        }

        @Override
        public Object getItem(int arg0) {
            // TODO Auto-generated method stub
            return arg0;
        }

        @Override
        public long getItemId(int arg0) {
            // TODO Auto-generated method stub
            return arg0;
        }

        @Override
        public View getView(int pos, View arg1, ViewGroup arg2) {
            // TODO Auto-generated method stub
            lin=(LayoutInflater)ctx.getSystemService(LAYOUT_INFLATER_SERVICE);
            arg1=lin.inflate(R.layout.fg, null);
            tv=(TextView)arg1.findViewById(R.id.textView1);
            b=(Button)arg1.findViewById(R.id.button1);
            tv.setText(as.get(pos).getValue());
            b.setText(as.get(pos).getValue());
            arg1.setTag(pos);
            b.setVisibility(as.get(pos).getVisibility());
            arg1.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {

                    int pos = (int) v.getTag();
                    Model model = as.get(pos);
                    model.setVisibility(visible2);
                    SampleAdapter.this.notifyDataSetChanged();

                }
            });
            return arg1;
        }

    }
    }

Snap

You can scroll up and down and the state remains

这篇关于缺少按钮滚动时在ListView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆