android listview检查长按自定义适配器

时间:2017-06-25 15:12:23

标签: android listview onclicklistener

我没有在互联网上找到任何正确的解决方案。

我的listview对象中有一些来自数据库的项目。为此我创建了一个自定义BaseAdapter并在适配器类中实现了OnLongClickListener()(我知道我会覆盖listview如何处理动画等等,但这只是为了学习)。

我可以通过长按选择多个项目并更改每个行的背景颜色。但我无法重置行(未经检查和"正常"背景颜色),尽管我在我的监听器中实现了这些行为。

我做错了什么?

这是我的自定义适配器类

package com.dacmas.shoppingapp;

import android.content.Context;
import android.text.AndroidCharacter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import com.amulyakhare.textdrawable.TextDrawable;
import com.amulyakhare.textdrawable.util.ColorGenerator;

import java.util.ArrayList;
import java.util.List;


public class ShoppingListAdapter extends BaseAdapter {
    private ArrayList< ShoppingListEntry > m_itemList;
    private Context m_context;
    private LayoutInflater m_inflater;
    private View m_convertView;

    public ShoppingListAdapter(Context context, ArrayList< ShoppingListEntry > shoppingListEntryArrayList ) {
    m_itemList = shoppingListEntryArrayList;
    m_context = context;
    m_inflater = ( LayoutInflater.from( context ) );
}

@Override
public int getCount() { return m_itemList.size(); }

@Override
public Object getItem( int position ) { return m_itemList.get( position ); }

@Override
public long getItemId( int position ) { return position; }

@Override
public View getView(final int position, View convertView, final ViewGroup parent ) {
    if ( convertView == null ) {
        m_convertView = LayoutInflater.from( m_context ).inflate( R.layout.list_row_shoppinglist, parent, false );
    }

    ImageView accountImage = (ImageView) m_convertView.findViewById(R.id.text_drawable);
    String firstLetterOfName = "A";
    ColorGenerator generator = ColorGenerator.MATERIAL;
    int color = generator.getRandomColor();

    TextDrawable drawable = TextDrawable.builder()
            .buildRound(firstLetterOfName, color);
    accountImage.setBackground(drawable);

    TextView title = ( TextView ) m_convertView.findViewById( R.id.txt_title );
    TextView info = ( TextView ) m_convertView.findViewById( R.id.txt_info );

    String itemTitle;
    String productBrand = m_itemList.get( position ).getProductBrand().toString();
    if ( !productBrand.isEmpty() ) {
        itemTitle = productBrand + " " + m_itemList.get( position ).getProductName().toString();
    } else {
        itemTitle = m_itemList.get( position ).getProductName().toString();
    }
    title.setText( itemTitle );

    String itemInfo;
    String productAmount = m_itemList.get( position ).getProductAmount();
    itemInfo = productAmount;
    info.setText( itemInfo );

    m_convertView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            if ( ((ListView)parent).isItemChecked(position) ) {
                ( ( ListView )parent ).setItemChecked( position, false );
                v.setBackgroundColor(m_convertView.getResources().getColor(R.color.colorWhite));
            } else {
                ( ( ListView )parent ).setItemChecked( position, true );
                v.setBackgroundColor(m_convertView.getResources().getColor(R.color.colorSelectedItem));
            }

            return false;
        }
    });

    return m_convertView;
}

}

1 个答案:

答案 0 :(得分:0)

问题是 - 您希望什么时候取消选择?

理想情况下,长按一次后,即可进入单一选择模式。从病房的那一点开始,它应该处理点击(触摸)以切换选择(并且可选地改变颜色)

现在您已完成选择选择,您可能希望

  • 执行删除所选项目等操作。
  • 等待某些其他操作退出选择模式。

如果是选项二,按下后退按钮(onBackPressed)可能会有效。因为你可以编写你的逻辑清除所有选择(颜色和复选框)

如果您可以将该逻辑烘焙到自定义适配器中以实现可重用性,那么这可能是一个好主意。