这是很久之前学过的内容,学过之后在开发一个wifi连接功能的时候,点击对应item的WiFi进行连接,能连接成功,功能都能实现,但是遇到了前端ui方面的问题,后来没时间就没做了,listView点击item,并且置顶,这个我在博客上面之前很少看到,所以就趁着目前在做测试之余,抽个时间想了一下,怎么实现ListView点击item置顶,好了,废话不多说了,直接上代码:
首先还是布局main_activity.xml,设置一个listView的控件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/lv_list_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
既然有了listView的控件了,那么接下来就是listView子项布局了,list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/list_item"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
布局都已经搞定,接下来就是listView的适配器了,这里我们新建一个MyListViewAdapter继承自baseAdapter,重写4个方法,并且使用内部类ViewHolder创建缓存view,加快listView中item的加载速度(个人理解,有不对的地方还请指正)
package com.example.listviewdemo_01;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.List;
/**
* author:besthyq
* date:2022/4/11
*/
public class MyListViewAdapter extends BaseAdapter {
private List<String> data;
private LayoutInflater inflater;
public MyListViewAdapter(Context context, List<String> data) {
this.data = data;
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int i) {
return data.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder viewHolder;
//这里用了缓存数据view,如果view为空,那么就加载布局并且找到item的view,设置标记,
// 如果不为空,那么直接获取标记
//不管是否为空,都去设置item的文字内容,并且返回
if (view == null){
viewHolder = new ViewHolder();
//加载布局
view = inflater.inflate(R.layout.list_item, viewGroup, false);
//找到item的textView
viewHolder.textView = view.findViewById(R.id.tv_list);
view.setTag(viewHolder);
}else {
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.textView.setText(data.get(i));
return view;
}
private class ViewHolder {
private TextView textView;
}
}
重点来了,点击item并将其置顶显示,这里在MainActivity中进行,我们点击item的时候,对List<item>进行更新,使list中的item项与第0项进行交换,然后刷新适配器就ok了
package com.example.listviewdemo_01;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {
private static final String TAG = "MainActivity";
private ListView listView;//listView
private MyListViewAdapter myListViewAdapter;//适配器
private List<String> items;//item集合
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.lv_list_view);
initData();
myListViewAdapter = new MyListViewAdapter(this,items);
listView .setAdapter(myListViewAdapter);
Log.i(TAG, "onCreate: "+items);
listView.setOnItemClickListener(this);
}
/**
* 初始化listview的数据item
*/
private void initData() {
items = new ArrayList<>();
for (int i = 0; i < 20; i++) {
items.add("items:" + (i + 1));
}
}
/**
* item子项点击事件
* @param adapterView
* @param view
* @param i
* @param l
*/
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(MainActivity.this, "点击了第:"+(i+1)+"项",Toast.LENGTH_SHORT).show();
updateData(0,i);
Log.i(TAG, "onItemClick: "+items);
//刷新适配器
myListViewAdapter.notifyDataSetChanged();
}
/**
* 更新数据,使点击的item置顶
* @param init
* @param i
*/
private void updateData(int init, int i) {
Collections.swap(items,init,i);
}
}