带有ListView和自定义适配器的复选框,无需使用数组

时间:2017-05-20 15:38:31

标签: android listview checkbox

这个问题很简单,因为它已经在这里进行了广泛讨论! - 关于Listview,复选框在流口水后失去状态或无法维持状态。 在我的情况下,当滚出视图时,选中的框会变得不固定。在这篇文章中:Listview, custom adapter and checkboxes,我几乎达到了渴望的行为;但是,它使用的是ArrayList,而且我已经读过这个实现的重绘次数,当你有一个很长的列表时,这是值得的...... 我在这里使用了20多个实现。不幸的是,我无法找出为什么不起作用。 所以,请耐心等待我。 我只发布我认为对我的问题至关重要的东西。 ShowChosenItensFromCategoriaActivity 下方。 注意:我将dbAdapter与SimpleCursorAdapter一起传递。

public class ShowChosenItensFromCategoriaActivity1 extends AppCompatActivity

{

private ListView mListView;
private SimpleCursorAdapter mCursorAdapter;
private Cursor mCursor;
private Bundle bundle;
private DBAdapter dbAdapter;
private int CATEGORIA_ID;

@Override
protected void onCreate(Bundle savedInstanceState)
{

    super.onCreate(savedInstanceState);
    bundle = this.getIntent().getExtras();
    CATEGORIA_ID = bundle.getInt("CATEGORIA_ID");

    setContentView(R.layout.show_all_produtos_from_chosen_categoria);
    dbAdapter = new DBAdapter(this);
    dbAdapter.open();
    mCursor = dbAdapter.getChosenProdutosFromCategoria(CATEGORIA_ID);

    String[] From = new String[]{"produtoname", "checked"};
    int[] To = new int[]{R.id.idlistitem, R.id.idcheck};

    mCursorAdapter = new ShowChosenItensFromCategoriaAdapter1(this,
                                                              R.layout
                                                              .show_all_produtos_from_chosen_categoria_row,
                                                              mCursor, From, To, 0, dbAdapter);
    mListView = (ListView) findViewById(R.id.produtos_listview);
    mListView.setAdapter(mCursorAdapter);
    }
}

现在 show_all_produtos_from_chosen_categoria.xml ,方法 getChosenProdutosFromCategoria(CATEGORIA_ID),它的 .show_all_produtos_from_chosen_categoria_row.xml

代码: show_all_produtos_from_chosen_categoria.xml

<?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"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

  <ListView
        android:id="@+id/produtos_listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/toolbar"
        android:layout_marginBottom="@dimen/list_padding"
        android:layout_marginTop="@dimen/list_padding"
        android:background="@color/lime_100"
        android:padding="@dimen/list_padding"
        android:scrollbarStyle="outsideOverlay"
  tools:listitem="@layout/show_all_produtos_from_chosen_categoria_row"/>
</RelativeLayout>

getChosenProdutosFromCategoria(CATEGORIA_ID)的代码:

public Cursor getChosenProdutosFromCategoria(int categoriaID)
{
    mCursor = mDB.rawQuery(
        "SELECT l._id, l.listaprodutoid as produtoID, p.produtoname as produtoname, " +
        "l.listacheckbox as checked " +
        "FROM tbllistadecompras l, tblprodutos p WHERE l.listaprodutoid = p._id and " +
        "l.listacategoriaid=" + categoriaID + " ORDER BY p.produtoname", null);


    if (mCursor != null) mCursor.moveToFirst();
    assert mCursor != null;
    return mCursor;
}

代码: show_all_produtos_from_chosen_categoria_row.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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="?android:attr/activatedBackgroundIndicator"
            android:orientation="horizontal"
            tools:context=".ShowChosenItensFromCategoriaActivity">

    <TextView
        android:id="@+id/idlistitem"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:elegantTextHeight="true"
        android:ellipsize="end"
        android:scrollHorizontally="false"
        android:textColor="@color/blue"
        android:textSize="20sp"/>

    <CheckBox
        android:id="@+id/idcheck"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_marginEnd="10dip"
        android:layout_marginStart="4dip"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:gravity="center">
    </CheckBox>
</RelativeLayout>

现在,最大的问题是,适配器 ShowChosenItensFromCategoriaAdapter。 我已经尝试过newView / bindView和getView。 在这里,我插入了 getView:方法:

class ShowChosenItensFromCategoriaAdapter extends SimpleCursorAdapter
{
    private DBAdapter dbAdapter;
    private final Context context;

    public ShowChosenItensFromCategoriaAdapter1(Context context, int 
 layout, Cursor c, String[] from, int[] to, int flags,DBAdapter dbAdapter)
    {
        super(context, layout, c, from, to, flags);
        this.context = context;
        this.dbAdapter = dbAdapter;

        dbAdapter.open();
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup 
parent)
    {
        ViewHolder viewHolder;
        final int auxProdutoID; // has to be, to be used inside the 
    checkbox.method
        if (mCursor.moveToPosition(position))
       {
           if (convertView == null)
           {
               LayoutInflater inflator = (LayoutInflater) 
    content.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
               viewHolder = new ViewHolder();
               viewHolder.produtoID = 
mCursor.getInt(mCursor.getColumnIndex("produtoID"));
               auxProdutoID = viewHolder.produtoID;
               viewHolder.textviewProduto = (TextView) 
convertView.findViewById(R.id.idlistitem);
               viewHolder.checkBox = (CheckBox) 
convertView.findViewById(R.id.idcheck);
               viewHolder.checkBox.setOnCheckedChangeListener(
                   new CompoundButton.OnCheckedChangeListener()
                   {
                    @Override
                    public void onCheckedChanged(CompoundButton 
 buttonView,boolean isChecked)
                   {
                       dbAdapter.setCheckBox(auxProdutoID, isChecked ? 1 
: 0);
                       viewHolder.checkBox.setSelected(isChecked);
                       //int getPosition = (Integer) 
buttonView.getTag();
                   }
                  });

           convertView.setTag(viewHolder);
      }
      else
      {
         viewHolder = (ViewHolder) convertView.getTag();
      } 

     viewHolder.checkBox.setTag(position)
     viewHolder.textviewProduto.setText(
     mCursor.getString(mCursor.getColumnIndex("produtoname")));
     viewHolder.checkBox.setChecked(
     mCursor.getInt(mCursor.getColumnIndex("checked")) == 1);

     return convertView;
    }
}

}

我很抱歉格式化。 如果你们有时间和耐心,我会感激任何帮助。

问候。

2 个答案:

答案 0 :(得分:0)

要确定是否应该检查视图,您使用的是数据库中列的值:

viewHolder.checkBox.setChecked(mCursor.getInt(mCursor.getColumnIndex("checked")) == 1);

但是要将视图标记为已选中,您使用的是DBAdapter类:

dbAdapter.setCheckBox(auxProdutoID, isChecked ? 1 : 0);

如果要控制DBAdapter类中的状态,则应该使用相同的代码来控制复选框状态,以确定是否应该检查检查,您应该检查DBAdapter类,或者是否更喜欢使用数据库, onClickListener你应该更新数据库中的数据。

答案 1 :(得分:0)

由于列表视图中使用的自定义项布局,有时会发生维护问题。 你试过这个吗?

longRunningTask