ListView中

时间:2017-04-27 21:49:46

标签: java android listview

我想为ListView中的每一行添加一个复选框,该复选框将被激活并在长按时显示,我不知道我是否认为正确,我应该在行布局中添加一个默认隐藏的Checkbox复选框动作开始列表上的所有复选框将显示并能够检查? LongPressPic

2 个答案:

答案 0 :(得分:0)

要在每行显示CheckBox

1。在适配器类中添加额外的boolean变量isLongPressed,并使用适配器false中的默认constructor值进行初始化。

2。在您的适配器getView() / onBindViewHolder()方法中添加如下条件:

CheckBox checkBox = (CheckBox) view.findViewById(R.id.check);
if(isLongPressed)
{
    checkBox.setVisibility(View.VISIBLE);
} else {
    checkBox.setVisibility(View.GONE);
}

3。在您的showCheckbox()课程中添加方法adapter,以ListView checkbox可见状态更新public void showCheckbox() { isLongPressed = true; notifyDataSetChanged(); // Required for update }

showCheckbox()

4。onItemLongClick致电list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(MainActivity.this, "Long Click", Toast.LENGTH_SHORT).show(); your_adapter.showCheckbox(); return true; } });

info_Button.setClickable(true);
    info_Button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mediaControl.pause();
            AlertDialog.Builder playstopbutton_builder = new AlertDialog.Builder(exercise_arm_triceps_execute.this);
            playstopbutton_builder.setTitle("WARNING").setMessage("Please get warm before exercising!");
            playstopbutton_builder.create().show();
            playstopbutton_builder.setCancelable(false);

            //if alert dialog is visible keep music paused
            //else if mediaControl.start();

        }
    });

这是关于Contextual Action Mode

的好教程

希望这会有所帮助〜

答案 1 :(得分:0)

试试这个: 我们将使用recyclerview和复选框适配器

Chechbox适配器布局

<?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="@dimen/checkbox_adapter_item_height"
android:gravity="center_vertical"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal">
<CheckBox
    android:id="@+id/checkbox"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    android:theme="@style/MyCheckBoxTheme"
    android:clickable="false"
    android:longClickable="false"
    android:focusable="false"/>

<TextView
    android:id="@+id/tvItem"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="item1"
    android:visibility="visible"
    android:padding="6dp"
    android:paddingStart="12dp"
    android:textColor="@color/colorMaterialBlack"
    android:textSize="16sp" />
</LinearLayout>

复选框样式,保持格式

<style name="MyCheckBoxTheme" parent="Theme.AppCompat.Light">
    <item name="colorControlNormal">@color/colorBlackDimText</item>
    <item name="colorControlActivated">@color/greenStatus</item>
</style>

Checkbox适配器的模型您可以在模型中定义/添加/删除vars

public class CheckboxTitlesData {

private String title;
private boolean isSelected;

public CheckboxTitlesData(String title, boolean isSelected) {
    this.title = title;
    this.isSelected = isSelected;
}

public String getTitle() {
    return title;
}

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

public boolean isSelected() {
    return isSelected;
}

public void setSelected(boolean selected) {
    isSelected = selected;
}

}

复选框适配器

public class CheckboxTitleAdapter extends RecyclerView.Adapter<CheckboxTitleAdapter.ViewHolder> implements GenericAdapterInterface{

List<CheckboxTitlesData> dataList = new ArrayList<>();
private CheckboxTitlesData previousSelection;
protected MyApplication.MenuSelectionListener listener;

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(getRootLayout(), parent, false);
    return new ViewHolder(view);
}

public CheckboxTitleAdapter(MyApplication.MenuSelectionListener listener){
    this.listener = listener;
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    CheckboxTitlesData data = dataList.get(position);
    if (data.isSelected()){
        previousSelection = data;
        holder.checkBox.setChecked(true);
    }else holder.checkBox.setChecked(false);
    holder.tvItem.setText(data.getTitle());
}

@Override
public int getItemCount() {
    return dataList.size();
}

@Override
public void changeData(List dataList) throws IllegalArgumentException{
    if (dataList == null || dataList.size() <= 0)
        return;
    if (!(dataList.get(0) instanceof CheckboxTitlesData))
        throw new IllegalArgumentException("Required data type \"CheckboxTitlesData\"");
    this.dataList.clear();
    this.dataList.addAll(dataList);
    (new Handler(Looper.getMainLooper())).postDelayed(new Runnable() {
        @Override
        public void run() {
            notifyDataSetChanged();
        }
    }, 100);
}

@Override
public int getRootLayout() {
    return R.layout.adapter_title_checkbox;
}

@Override
public void setOnClickListener(RecyclerView.ViewHolder holder) {
  holder.itemView.setOnLongClickListener((View.OnLongClickListener) holder);
}

class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

    @Bind(R.id.tvItem)
    TextView tvItem;
    @Bind(R.id.checkbox)
    CheckBox checkBox;

    ViewHolder(View itemView) {
        super(itemView);
        ButterKnife.bind(this, itemView);
        itemView.setOnClickListener(this);
        setOnClickListener(this);
    }

    @Override
    public boolean onLongClick(View v) {
        final int pos = dataList.indexOf(previousSelection);
        if (pos == getAdapterPosition())
            return;
        if (listener != null)
            listener.onMenuSelected(dataList.get(getAdapterPosition()));
        CheckboxTitlesData data = dataList.get(getAdapterPosition());
        data.setSelected(true);
        dataList.set(getAdapterPosition(), data);
        if (pos != -1) {
            previousSelection.setSelected(false);
            dataList.set(pos, previousSelection);
        }
        (new Handler(Looper.getMainLooper())).postDelayed(new Runnable() {
            @Override
            public void run() {
                notifyDataSetChanged();
            }
        }, 100);
        return true
    }
}

}

接口,如果需要,你可以删除接口,我只是将它用于我的适配器,通常是为了其他开发人员的可读性:

public interface GenericAdapterInterface {
  void changeData(List dataList) throws Exception;
  int getRootLayout();
  void setOnClickListener(RecyclerView.ViewHolder holder);
}

Recycler视图布局xml,添加你需要的recyclerview,这只是一个例如

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/llBody"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingEnd="@dimen/padding_normal"
android:paddingStart="@dimen/padding_normal">

<android.support.v7.widget.RecyclerView
    android:id="@+id/rvMenu"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

</android.support.v7.widget.RecyclerView>
</LinearLayout>

使用回收站视图的活动/片段必须执行此操作

@Bind(R.id.rvMenu)
RecyclerView rvMenu;

private CheckboxTitleAdapter menuAdapter;
//Define an interface for callback on long press
public interface YourOwnInterface {
    void onLonPress(Object data);
}

private void setUpRecycleView() {
    RecyclerView.LayoutManager mLayoutManager = new 
    LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
    rvMenu.setHasFixedSize(false);
    rvMenu.setLayoutManager(mLayoutManager);
    rvMenu.setItemAnimator(new DefaultItemAnimator());
YourOwnInterface listener = new YourOwnInterface () {
        @Override
        public void onLonPress(Object data) {
            updateView((CheckboxTitlesData) data);
        }
    };
//this interface is needed wen a longpress is made adapter and the callback is given to your Acitivity/Fragment you can perform necessary opreation
    menuAdapter = new CheckboxTitleAdapter(listener);
    rvMenu.setAdapter(menuAdapter);
}

private void updateView(CheckboxTitlesData data) {
   //perform operation on long press
}

完成工作