android Listview 浏览位置

35 篇文章 0 订阅
2 篇文章 0 订阅

我用的是假数据进行的测试
这个位置记录是我想起在我上一家工作的时候的一个需求(bug)

上代码:
bean类上就要上全套

public class Base {
    private int iconId;//对应图片资源id
    private String title;
    private String time;

    public Base(int iconId, String title, String time) {
        this.iconId = iconId;
        this.title = title;
        this.time = time;
    }

    public void setIconId(int iconId) {
        this.iconId = iconId;
    }

    public int getIconId() {
        return iconId;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }
}

接下来就是适配器

public class BaseAdapters extends ArrayAdapter<Base> {
    private int resourceId;
    /**
     * 重写父类构造函数,传入上下文, ListView子布局id, 数据
     * @param context
     * @param textViewResourceId
     * @param objects
     */
    public BaseAdapters(@NonNull Context context, int textViewResourceId, @NonNull List<Base> objects) {
        super(context, textViewResourceId, objects);
        resourceId = textViewResourceId;
    }

    /**
     * 每个子项被滚动到屏幕内的时候调用
     * @param position
     * @param convertView
     * @param parent
     * @return
     */
    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        Base base = getItem(position);//获取当前项 Base 实例

        View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);

        ImageView baseIcon = (ImageView) view.findViewById(R.id.icon);
        TextView baseTitle = (TextView) view.findViewById(R.id.title);
        TextView baseTime = (TextView) view.findViewById(R.id.time);

        baseIcon.setImageResource(base.getIconId());
        baseTitle.setText(base.getTitle());
        baseTime.setText(base.getTime());

        return view;
    }
}

适配器布局

<?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="wrap_content"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/time"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </LinearLayout>

</LinearLayout>

MainActivity代码

public class MainActivity extends AppCompatActivity {

    private ListView listView;
    private List<Base> baseList = new ArrayList<>();
    private static int p=0;
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
    String date = df.format(new Date());// new Date()为获取当前系统时间,也可使用当前时间戳
    //当前条目的当前位置
    private int scrolledX = 0;
    private int scrolledY = 0;
    private SharedPreferences.Editor scrolledYs;
    private SharedPreferences.Editor scrolledXs;
    private SharedPreferences.Editor edit;
    private SharedPreferences config;
    private BaseAdapters adapter;

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //设置适配器
        initBases();
        //创建ContentAdapter实例,传入上下文, 子布局id ,数据baseList
        adapter = new BaseAdapters(MainActivity.this,R.layout.base_item,baseList);
        listView = findViewById(R.id.listviews);
        listView.setAdapter(adapter);//绑定适配器

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                p=i;
            }
        });
        //listView滑动时记录记录位置
        listView.setOnScrollListener(new AbsListView.OnScrollListener() {


            private int scrolledYss;
            private int scrolledXss;

            @Override
            public void onScrollStateChanged(AbsListView absListView, int i) {
                 if (i== AbsListView.OnScrollListener.SCROLL_STATE_IDLE){
                      try {
                          //当前可见的条目
                           scrolledX = absListView.getFirstVisiblePosition();
                           scrolledY = absListView.getChildAt(0).getTop();

                           config = getSharedPreferences("config", MainActivity.this.MODE_PRIVATE);
                           edit = config.edit();
                           scrolledXs = edit.putInt("scrolledX",scrolledX);
                           scrolledYs = edit.putInt("scrolledY",scrolledY);
                           edit.commit();


                      }catch (Exception e){

                      }
                 }
            }

            @Override
            public void onScroll(AbsListView absListView, int i, int i1, int i2) {

            }
        });
    }


    private void initBases(){

        for(int i = 0; i < 20; i++){

            Base baseOne = new Base(R.drawable.one,"1",date);
            baseList.add(baseOne);
            Base baseTwo = new Base(R.drawable.two,"2",date);
            baseList.add(baseTwo);
            Base baseThree = new Base(R.drawable.one,"1",date);
            baseList.add(baseOne);
            Base baseFour = new Base(R.drawable.two,"2",date);
            baseList.add(baseTwo);
        }

    }

    //viewlist当前的位置
    public void onBack(){
        /*listView.setSelectionFromTop(scrolledX,scrolledX);
        listView.scrollTo(scrolledX, scrolledY);*/
        listView.setSelection(p);
       // adapter.notifyDataSetChanged();

    }
    //每次在页面可见的时候获取listview当前条目位置
    @Override
    protected void onResume() {
        super.onResume();
        onBack();
    }
}

MainActivity布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/listviews"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</RelativeLayout>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王鑫林呀!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值