使用ListView实现一个简单的上移下移左移右移添加删除等功能,这里和ListView的item拖拽功能目的类似,根据项目需求来决定吧,之前有看到过一个邮箱有类似的功能,所以做个笔记了。有更好的实现方法的话可以来指导一下。
一.效果图:源码下载 列表操作等功能DouYinWu-master.zip
上图可以看到列表效果,两个ListView的单选效果,然后进行左右列表的删除、添加、上移、下移等功能,RecyclerView其实更好实现。
二.具体是实现代码如下:
1.主函数:(贴出全部代码)SgfListViewMoveActivity.java:
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.Toast;
import com.example.qd.douyinwu.R;
import com.example.qd.douyinwu.adapter.PicAndFondAdapter;
import com.example.qd.douyinwu.bean.PicAndfontBean;
import java.util.ArrayList;
import java.util.List;
public class SgfListViewMoveActivity extends AppCompatActivity {
private Button btLeft;
private Button btRight;
private Button btUp;
private Button btDown;
private ListView listviewLeft;
private ListView listviewRight;
private PicAndFondAdapter picAndFondAdapter, picAndFondAdapterR;
private List<PicAndfontBean> list = new ArrayList<PicAndfontBean>();
private List<PicAndfontBean> listR = new ArrayList<PicAndfontBean>();
private int mposition = -1;
private int mRPosition = -1;
private LinearLayout llAddRight;
private LinearLayout llLvRight;
private Button btAddRight;
private boolean isLastOneR = false;
private Button btDeleteR,btDeleteL;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lv_sgf_m);
btLeft = findViewById(R.id.bt_left);
btRight = findViewById(R.id.bt_right);
btUp = findViewById(R.id.bt_up);
btDown = findViewById(R.id.bt_down);
listviewLeft = findViewById(R.id.listview_left);
listviewRight = findViewById(R.id.listview_right);
llAddRight = findViewById(R.id.ll_add_right);
llLvRight = findViewById(R.id.ll_lv_right);
btAddRight = findViewById(R.id.bt_add_right);
btDeleteR = findViewById(R.id.bt_delete_r);
btDeleteL = findViewById(R.id.bt_delete_l);
View foot_view = View.inflate(this, R.layout.foot_view, null);
ImageView add = (ImageView) foot_view.findViewById(R.id.add);
// listview.addFooterView(foot_view);
initview();
}
private void initview() {
list.clear();
listR.clear();
list.add(new PicAndfontBean("11111"));
list.add(new PicAndfontBean("22222"));
list.add(new PicAndfontBean("33333"));
list.add(new PicAndfontBean("44444"));
list.add(new PicAndfontBean("55555"));
list.add(new PicAndfontBean("66666"));
listR.add(new PicAndfontBean("R_99999"));
listR.add(new PicAndfontBean("R_556666"));
listR.add(new PicAndfontBean("R_77777"));
picAndFondAdapter = new PicAndFondAdapter(SgfListViewMoveActivity.this, list);
picAndFondAdapterR = new PicAndFondAdapter(SgfListViewMoveActivity.this, listR);
listviewLeft.setAdapter(picAndFondAdapter);
listviewRight.setAdapter(picAndFondAdapterR);
listviewLeft.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mposition = position;
}
});
listviewRight.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mRPosition = position;
// LinearLayout view1 = (LinearLayout) parent.getChildAt(position);//这个代表在checkbox的布局文件下的第一层布局)
// RelativeLayout views = (RelativeLayout) view1.getChildAt(0);//(这个代表在checkbox的布局文件下的第二层布局)
// CheckBox box = (CheckBox) views.findViewById(R.id.cb_select);//(在第二层布局中找到checkbox控件)
// box.setChecked(!box.isChecked()); //(这个就是关键设置)
// listR.get(position).isCb();
// PicAndfontBean ai = listR.get(position);
// boolean isCheck = ai.isCb();
// ai.setCb(isCheck);
picAndFondAdapterR.notifyDataSetChanged();
}
});
//删除右侧数据
btDeleteR.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("Sgf----", "listR.size()3" + "-----" + listR.size());
Log.e("Sgf----", "mRPosition3" + "-----" + mRPosition);
if (mRPosition < 0) {
Toast.makeText(SgfListViewMoveActivity.this, "请选择右侧要操作的条目", Toast.LENGTH_SHORT).show();
} else {
if(listR.size() == 1 ){
llAddRight.setVisibility(View.VISIBLE);
llLvRight.setVisibility(View.GONE);
}
if(listR.size()>0){
listR.remove(mRPosition);
}else {
Toast.makeText(SgfListViewMoveActivity.this, "没有数据啦", Toast.LENGTH_SHORT).show();
}
if(mRPosition >=1){
mRPosition = mRPosition -1;
}
picAndFondAdapterR = new PicAndFondAdapter(SgfListViewMoveActivity.this, listR);
listviewRight.setAdapter(picAndFondAdapterR);
//刷新右侧数据的选中状态
listviewRight.setItemChecked(mRPosition, true);
}
}
});
//删除左侧数据
btDeleteL.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("Sgf----", "mposition789" + "-----" + mposition);
if (mposition < 0) {
Toast.makeText(SgfListViewMoveActivity.this, "请选择右侧要操作的条目", Toast.LENGTH_SHORT).show();
} else {
if(list.size()>0){
list.remove(mposition);
}else {
Toast.makeText(SgfListViewMoveActivity.this, "没有数据啦", Toast.LENGTH_SHORT).show();
}
if(mposition >=1){
mposition = mposition -1;
}
picAndFondAdapter = new PicAndFondAdapter(SgfListViewMoveActivity.this,list);
listviewLeft.setAdapter(picAndFondAdapter);
//刷新右侧数据的选中状态
listviewLeft.setItemChecked(mposition, true);
}
}
});
//添加右侧数据
btAddRight.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(listR!=null){
listR.clear();
listR.add(new PicAndfontBean("R_WEI"));
listR.add(new PicAndfontBean("R_AUTO"));
listR.add(new PicAndfontBean("R_AXS"));
picAndFondAdapterR = new PicAndFondAdapter(SgfListViewMoveActivity.this, listR);
listviewRight.setAdapter(picAndFondAdapterR);
llAddRight.setVisibility(View.GONE);
llLvRight.setVisibility(View.VISIBLE);
}
}
});
//右侧数据左移
btLeft.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("Sgf----", "mRPosition" + "-----" + mRPosition);
Log.e("Sgf----", "mRPositionR" + "-----" + (picAndFondAdapterR.getCount() - 1));
Log.e("Sgf----", "listR.s" + "-----" + listR.size());
if (listR != null && listR.size() > 0) {
if (mRPosition < 0) {
Toast.makeText(SgfListViewMoveActivity.this, "请选择右侧要操作的条目", Toast.LENGTH_SHORT).show();
} else {
//先向左侧列表添加数据
list.add(new PicAndfontBean(listR.get(mRPosition).getWenzi()));
picAndFondAdapter.notifyDataSetChanged();
//然后再删除右侧的数据
listR.remove(mRPosition);
picAndFondAdapterR.notifyDataSetChanged();
if(mRPosition >=1){
mRPosition = mRPosition -1;
}
}
picAndFondAdapter = new PicAndFondAdapter(SgfListViewMoveActivity.this, list);
listviewLeft.setAdapter(picAndFondAdapter);
picAndFondAdapterR = new PicAndFondAdapter(SgfListViewMoveActivity.this, listR);
listviewRight.setAdapter(picAndFondAdapterR);
//刷新右侧数据的选中状态
listviewRight.setItemChecked(mRPosition, true);
//添加数据
// PicAndfontBean bean = new PicAndfontBean();
// bean.setPic("http://img.pconline.com.cn/images/upload/upc/tx/itbbs/1202/09/c3/10378469_1328796216421_1024x1024it.jpg");
// bean.setWenzi("KING");
// list.add(bean);
// picAndFondAdapter.notifyDataSetChanged();
if(listR.size() == 1 && mRPosition == 0){
mRPosition = 0;
Log.e("Sgf----", "listR.s" + "-----进入");
//刷新右侧数据的选中状态
listviewRight.setItemChecked(1, true);
}else {
Log.e("Sgf----", "listR.s" + "-----没进");
}
} else {
llAddRight.setVisibility(View.VISIBLE);
llLvRight.setVisibility(View.GONE);
Toast.makeText(SgfListViewMoveActivity.this, "已经没有数据啦", Toast.LENGTH_SHORT).show();
}
if((listR.size())==0){//当右侧列表数据为0时,显示添加数据按钮
llAddRight.setVisibility(View.VISIBLE);
llLvRight.setVisibility(View.GONE);
}
}
});
btRight.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (list != null && list.size() > 0) {
if (mposition < 0) {
Toast.makeText(SgfListViewMoveActivity.this, "请选择左侧要操作的条目", Toast.LENGTH_SHORT).show();
} else {
//先向右侧列表添加数据
listR.add(new PicAndfontBean(list.get(mposition).getWenzi()));
picAndFondAdapterR.notifyDataSetChanged();
//然后再删除左侧的数据
list.remove(mposition);
picAndFondAdapter.notifyDataSetChanged();
if((listR.size())>0){//当右侧列表数据为0时,显示添加数据按钮
llAddRight.setVisibility(View.GONE);
llLvRight.setVisibility(View.VISIBLE);
}
}
if(mposition >=1){
mposition = mposition -1;
}
picAndFondAdapter = new PicAndFondAdapter(SgfListViewMoveActivity.this,list);
listviewLeft.setAdapter(picAndFondAdapter);
picAndFondAdapterR = new PicAndFondAdapter(SgfListViewMoveActivity.this,listR);
listviewRight.setAdapter(picAndFondAdapterR);
//刷新右侧数据的选中状态
listviewLeft.setItemChecked(mposition, true);
listviewRight.setItemChecked(listR.size() - 1, true);
// listviewLeft.setItemChecked(list.size()-1, true);
Log.e("Sgf----", "listR.size()" + "-----" + listR.size());
Log.e("Sgf----", "list.size()" + "-----" + list.size());
} else {
Toast.makeText(SgfListViewMoveActivity.this, "已经没有数据啦", Toast.LENGTH_SHORT).show();
}
}
});
//上移
btUp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mRPosition == -1) {
Toast.makeText(SgfListViewMoveActivity.this, "请选择要操作的条目", Toast.LENGTH_SHORT).show();
} else if (mRPosition == 0) {
Toast.makeText(SgfListViewMoveActivity.this, "已经是第一条了", Toast.LENGTH_SHORT).show();
} else {
indexExChange(listR, mRPosition, mRPosition - 1);
picAndFondAdapterR.notifyDataSetChanged();
mRPosition = mRPosition - 1;
}
listviewRight.setItemChecked(mRPosition, true);
}
});
//下移
btDown.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//最后一条数据
final int lastItemPosition = picAndFondAdapterR.getCount() - 1;
final int lastVisiblePosition = listviewRight.getLastVisiblePosition();
if (mRPosition == -1) {
Toast.makeText(SgfListViewMoveActivity.this, "请选择要操作的条目", Toast.LENGTH_SHORT).show();
} else if (mRPosition == lastItemPosition) {
Toast.makeText(SgfListViewMoveActivity.this, "已经是最后一条了", Toast.LENGTH_SHORT).show();
} else {
indexExChange(listR, mRPosition, mRPosition + 1);
picAndFondAdapterR.notifyDataSetChanged();
mRPosition = mRPosition + 1;
}
picAndFondAdapterR.notifyDataSetChanged();
// for (int i = 0; i < listR.size(); i++) {
// // 默认第一个item被选中
// //全部不选中
// listviewRight.setItemChecked(i, false);
// }
//实时的刷新选中的条目
listviewRight.setItemChecked(mRPosition, true);
}
});
}
public static <T> List<T> indexExChange(List<T> list, int index1, int index2) {
T t = list.get(index1);
list.set(index1, list.get(index2));
list.set(index2, t);
return list;
}
}
2.主函数布局:activity_lv_sgf_m.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimary"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:layout_weight="1">
<ListView
android:id="@+id/listview_left"
android:layout_width="match_parent"
android:layout_height="300dp"
android:cacheColorHint="@android:color/transparent"
android:choiceMode="singleChoice"
android:divider="@color/colorPrimary"
android:dividerHeight="5dp"
android:listSelector="@drawable/bg_selete_lv_color2" />
</LinearLayout>
<View
android:layout_width="1dp"
android:layout_height="300dp"
android:background="#333" />
<LinearLayout
android:id="@+id/ll_lv_right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_weight="1"
android:visibility="visible">
<ListView
android:id="@+id/listview_right"
android:layout_width="match_parent"
android:layout_height="300dp"
android:cacheColorHint="@android:color/transparent"
android:choiceMode="singleChoice"
android:divider="@color/colorPrimary"
android:dividerHeight="5dp"
android:listSelector="@drawable/bg_selete_lv_color2" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_add_right"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:visibility="gone">
<Button
android:id="@+id/bt_add_right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加" />
</LinearLayout>
</LinearLayout>
<HorizontalScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/bt_left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="左" />
<Button
android:id="@+id/bt_right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="右" />
<Button
android:id="@+id/bt_up"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="上" />
<Button
android:id="@+id/bt_down"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下" />
<Button
android:id="@+id/bt_delete_l"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除(左)" />
<Button
android:id="@+id/bt_delete_r"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除(右)" />
</LinearLayout>
</HorizontalScrollView>
</LinearLayout>
3.适配器:PicAndFondAdapter.java
import android.app.Activity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.qd.douyinwu.R;
import com.example.qd.douyinwu.bean.PicAndfontBean;
import java.util.ArrayList;
import java.util.List;
public class PicAndFondAdapter extends BaseAdapter {
private List<PicAndfontBean> list = new ArrayList<PicAndfontBean>();
private Activity context;
// private DisplayImageOptions displayImageOptions;
public PicAndFondAdapter(Activity context, List<PicAndfontBean> list){
this.context = context;
this.list = list;
// 初始化ImageLoader
// ImageLoaderUtils.initBigImageLoader(context);
// displayImageOptions = ImageLoaderUtils.getDisplayOptions();
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = View.inflate(context, R.layout.item_pic_wenzi, null);
// holder.img = (ImageView) convertView.findViewById(R.id.img);
// holder.cb_select = (CheckBox) convertView.findViewById(R.id.cb_select);
holder.edit = (TextView) convertView.findViewById(R.id.edit);
// holder.icon_up = (ImageView) convertView.findViewById(R.id.icon_up);
// holder.icon_down = (ImageView) convertView.findViewById(R.id.icon_down);
// holder.icon_delete = (ImageView) convertView.findViewById(R.id.icon_delete);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
// if (position == 0){
// holder.icon_up.setVisibility(View.GONE);
// }else{
// holder.icon_up.setVisibility(View.VISIBLE);
// }
// if (position == list.size()-1&&position != 0){
// holder.icon_down.setVisibility(View.GONE);
// }else{
// holder.icon_down.setVisibility(View.VISIBLE);
// }
final PicAndfontBean bean = list.get(position);
holder.edit.setText(bean.getWenzi());
// ImageLoader.getInstance().displayImage(
// bean.getPic(), holder.img,
// displayImageOptions);
//下移
// holder.icon_down.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
// bean.setWenzi(holder.edit.getText().toString());
bean.setPic("http://img.pconline.com.cn/images/upload/upc/tx/itbbs/1202/09/c3/10378469_1328796216421_1024x1024it.jpg");
// indexExChange(list,position,position+1);
// notifyDataSetChanged();
//
// }
// });
//上移
// holder.icon_up.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
//
// bean.setWenzi(holder.edit.getText().toString());
bean.setPic("http://img.pconline.com.cn/images/upload/upc/tx/itbbs/1202/09/c3/10378469_1328796216421_1024x1024it.jpg");
//
// indexExChange(list, position, position - 1);
// notifyDataSetChanged();
//
// }
// });
// holder.icon_delete.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
//
// list.remove(position);
// notifyDataSetChanged();
// }
// });
// holder.edit.setOnFocusChangeListener(new View.OnFocusChangeListener() {
//
// @Override
// public void onFocusChange(View v, boolean hasFocus) {
// if(hasFocus){//获得焦点
// // ((InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(context.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
// }else{//失去焦点
//
// bean.setWenzi(holder.edit.getText().toString());
// bean.setPic("http://img.pconline.com.cn/images/upload/upc/tx/itbbs/1202/09/c3/10378469_1328796216421_1024x1024it.jpg");
//
// }
// }
// });
return convertView;
}
class ViewHolder{
// public ImageView img,icon_up,icon_down,icon_delete;
private TextView edit;
private CheckBox cb_select;
}
public static <T> List<T> indexExChange(List<T> list,int index1,int index2){
T t = list.get(index1);
list.set(index1, list.get(index2));
list.set(index2, t);
return list;
}
}
4.适配器布局:item_pic_wenzi.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="wrap_content"
android:layout_marginRight="10dp"
android:layout_marginLeft="10dp"
android:background="@drawable/list_selector"
android:orientation="vertical">
<!--android:descendantFocusability="blocksDescendants"-->
<RelativeLayout
android:layout_width="match_parent"
android:gravity="center"
android:layout_height="45dp">
<TextView
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#333"
android:gravity="center"
android:layout_gravity="center"
android:textSize="23sp"
android:layout_centerInParent="true"
android:text="KING" />
<!--<CheckBox-->
<!--android:id="@+id/cb_select"-->
<!--android:layout_alignParentRight="true"-->
<!--android:layout_centerVertical="true"-->
<!--android:layout_marginRight="10dp"-->
<!--android:focusable="false"-->
<!--android:layout_width="wrap_content"-->
<!--android:layout_height="wrap_content" />-->
</RelativeLayout>
</LinearLayout>
5.状态选择器、颜色
bg_selete_lv_color2.cml:
<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 没有焦点时的背景颜色 -->
<item android:state_window_focused="false"
android:drawable="@drawable/shape_yellow_sgf" />
<!-- 非触摸模式下获得焦点并单击时的背景颜色 -->
<item android:state_focused="true" android:state_pressed="true"
android:drawable="@drawable/shape_yellow_sgf" />
<!--触摸模式下单击时的背景颜色 -->
<item android:state_focused="false" android:state_pressed="true"
android:drawable="@drawable/shape_yellow_sgf" />
<!--选中时的背景颜色 -->
<item android:state_selected="true" android:drawable="@drawable/shape_yellow_sgf" />
<!--获得焦点时的背景 颜色-->
<item android:state_focused="true" android:drawable="@drawable/shape_yellow_sgf" />
</selector>
shape_yellow_sgf.xml:
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!--无圆角边框-->
<solid android:color="@android:color/white" />
<!--填充的颜色-->
<!--描边-->
<stroke
android:width="1dp"
android:color="#FF0" />
<!--设置外层边线的圆角度数-->
<corners android:radius="8dp"></corners>
</shape>
color:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#008577</color>
<color name="colorPrimaryDark">#00574B</color>
<color name="colorAccent">#D81B60</color>
<color name="transparent_gray_light">#89000000</color>
<color name="white">#fff</color>
<color name="split_line2">#333</color>
<color name="divider">#ffd2d2d2</color>
<color name="light_green_900">#33691E</color>
<color name="purple_500">#9C27B0</color>
<color name="pink_500">#FF4081</color>
<color name="orange_500">#FF9800</color>
<color name="cyan_500">#00BCD4</color>
<color name="yellow_900">#F57F17</color>
<color name="item_bg">#454545</color>
<color name="item_bg_pressed">#707070</color>
<color name="green">#00ff00</color>
</resources>
6.PicAndfontBean.java:
import java.io.Serializable;
public class PicAndfontBean implements Serializable {
private String pic;
private String wenzi;
private boolean isCb;
public boolean isCb() {
return isCb;
}
public void setCb(boolean cb) {
isCb = cb;
}
public String getPic() {
return pic;
}
public void setPic(String pic) {
this.pic = pic;
}
public String getWenzi() {
return wenzi;
}
public void setWenzi(String wenzi) {
this.wenzi = wenzi;
}
public PicAndfontBean(String pic, String wenzi) {
this.pic = pic;
this.wenzi = wenzi;
}
public PicAndfontBean(String wenzi) {
this.wenzi = wenzi;
}
public PicAndfontBean() {
}
}