ListView选择多个项目

时间:2014-09-21 22:29:04

标签: java android sqlite listview

我在android中遇到listview的问题,我创建了一个列表视图,它使用自定义ArrayAdapter从SQLite数据库中获取数据 我想在用户选择项目时显示图像视图,但是当我点击某个项目时,图像(复选标记)显示在3个其他项目中 我不知道问题究竟在哪里,这是我的适配器代码:

import info.androidhive.tabsswipe.R;

import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.itdinamik.tabswipe.CompareVehicle;
import com.itdinamik.vcompare.MySQLiteHelper;
import com.itdinamik.vcompare.Vehicle;

public class ComperAdapter extends ArrayAdapter<Vehicle>{

List<Vehicle>   data;
Context context;
int layoutResID;
Vehicle itemdata;
MySQLiteHelper dbhelper;

public ComperAdapter(Context context, int layoutResourceId, List<Vehicle> data) {

super(context, layoutResourceId, data);
this.data=data;
this.context=context;
this.layoutResID=layoutResourceId;

}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
final NewsHolder holder;
View row = convertView;

dbhelper = new MySQLiteHelper(context);

if(row == null)
{
    LayoutInflater inflater = ((Activity)context).getLayoutInflater();
    row = inflater.inflate(layoutResID, parent, false);

    holder = new NewsHolder();

    holder.itemNameTitle = (TextView)row.findViewById(R.id.VehicleTxt);
    holder.itemNameScore = (TextView)row.findViewById(R.id.Score);
    holder.CheckedMark=(ImageView)row.findViewById(R.id.Checked);
    holder.Vehicle=(ImageView)row.findViewById(R.id.Vehicle);
    holder.RL = (RelativeLayout)row.findViewById(R.id.Rv);

    row.setTag(holder);
}
else
{
    holder = (NewsHolder)row.getTag();
}

//Toast.makeText(getContext(), String.valueOf(position +" - " + CompareVehicle.ClickedItem),               Toast.LENGTH_SHORT).show();
if(CompareVehicle.ItemClieckd) {
 if(position == CompareVehicle.ClickedItem) {
     Log.w("Position", String.valueOf(position));
     holder.CheckedMark.setVisibility(View.VISIBLE);
     holder.RL.setBackgroundColor(Color.rgb(201, 50, 39));
 }

}
itemdata = data.get(position);
holder.itemNameTitle.setText(itemdata.getTitle() + " - " + itemdata.getKraj() + " - "+ String.valueOf(position) + " - " + CompareVehicle.ClickedItem);

double totaldefault = itemdata.getOhranjenost()*0.25+itemdata.getPrevozeni()*0.16+
        itemdata.getServis()*0.14+ itemdata.getCena()*0.13+
        itemdata.getPoraba()*0.11+ itemdata.getStarost()*0.08+
        itemdata.getDodatna()*0.07+ itemdata.getCenaZav()*0.06;

holder.itemNameScore.setText(String.format("%.1f",totaldefault));

return row;
}

static class NewsHolder{

TextView itemNameTitle;
TextView itemNameScore;
ImageView CheckedMark, Vehicle;
RelativeLayout RL;
}

}

这个是我的片段,用于显示我的列表视图

import info.androidhive.tabsswipe.R;

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

import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.Toast;

import com.itdinamik.tabswipe.adapter.ComperAdapter;
import com.itdinamik.vcompare.MySQLiteHelper;
import com.itdinamik.vcompare.Vehicle;

public class CompareVehicle extends Fragment{
ViewPager mViewPager;
ArrayList<Vehicle>  DataList;
static MySQLiteHelper dbhelper;

ComperAdapter adapter;
List<Vehicle> itemData;


ListView lv;
Button CompareButton;

int ClickedNum = 0;
public static int ClickedItem;
public static boolean ItemClieckd = false;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_compare_vehicle, container, false);
    lv = (ListView)rootView.findViewById(R.id.CompareList);
    CompareButton = (Button)rootView.findViewById(R.id.CompareButton);

     dbhelper = new MySQLiteHelper(getActivity());

    // get all vehicles
     itemData = dbhelper.getAllVehicles();

     adapter=new ComperAdapter(getActivity(),R.layout.list_single,itemData);
     lv.setAdapter(adapter);

     lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                long arg3) {
            // TODO Auto-generated method stub
            ClickedItem = position;
            ItemClieckd = true;
            ClickedNum += 1;
            adapter.notifyDataSetChanged();
            /*RelativeLayout Rl = (RelativeLayout)arg1.findViewById(R.id.Rv);
            ImageView CheckImg = (ImageView)arg1.findViewById(R.id.Checked);
            Rl.setBackgroundColor(Color.rgb(201, 50, 39));
            CheckImg.setVisibility(View.VISIBLE);*/

            //Toast.makeText(getActivity(), String.valueOf(mSelectedItem), Toast.LENGTH_LONG).show();

        }
    });


     CompareButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (ClickedNum < 2) {
                Toast.makeText(getActivity(), "Please mark at least 2 items to compare them", Toast.LENGTH_LONG).show();
            }
        }
    });


    return rootView;
}

}

谢谢

1 个答案:

答案 0 :(得分:0)

为了避免ListViews等中的视图回收问题,我在提供给boolean的构造函数的项数据List中包含ArrayAdapter检查状态。我还提供了自己的interface来处理自定义列表项布局中包含的子Views上的点击事件。

在下面的示例中,我们处理了一个可以单击的复选框,还有一个可以长按的标签:

public class MyListAdapter extends ArrayAdapter<MyItem> {

    // interface for handling item child view events
    public interface MyListAdapterListener {
        void onItemCheckClicked(int index);
        void onItemLabelLongClicked(int index);        
    }

    private MyListAdapterListener mMyListAdapterListener;
    int layoutResID;

    // Constructor
    public MyListAdapter(Context context, int resource, List<MyItem> myItems) {
        super(context, resource, myItems);
        layoutResID = resource;
    }

    public void setMyListAdapterListener(MyListAdapterListener listener) {
        this.mMyListAdapterListener = listener;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        // setup the row
        View row;
        if (convertView == null) {
            LayoutInflater inflater = LayoutInflater.from(getContext());
            row = inflater.inflate(layoutResID, null);
        } else {
            row = convertView;
        }

        // setup the ViewHolder for this item
        ViewHolder holder = (ViewHolder) row.getTag();
        if (holder == null) {
            holder = new ViewHolder(row);
            row.setTag(holder);
        }

        // setup this item's label view
        holder.label.setText(getItem(position).label);
        // tag this item's label view with position so it can be retrieved in the onLongClick
        holder.label.setTag(position);
        // set the OnLongClickListener for the this item's label view 
        holder.label.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                if (mActivityListListener != null) {
                // retrieve position from the view's tag, and trigger the listeners onItemLabelLongClicked method
                    mActivityListListener.onItemLabelLongClicked((Integer)v.getTag());
                }
                return false;
            }
        });

        // setup this item's checkbox view
        holder.checkbox.setChecked(getItem(position).myItemCheckBoolean);
        // tag this item's checkbox view with position so it can be retrieved in the onClick
        holder.checkbox.setTag(position);
        // set the OnClickListener for the this item's checkbox view 
        holder.checkbox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mMyListAdapterListener != null) {
                    // retrieve position from the view's tag, and trigger the listeners onItemCheckClicked method
                    mMyListAdapterListener.onItemCheckClicked((Integer) v.getTag());
                }                    
            }
        });

        return row;
    }

    class ViewHolder {
        CheckBox checkbox = null;
        TextView label = null;

        ViewHolder(View row) {
            this.checkbox = (CheckBox) row.findViewById(R.id.check_box);
            this.label = (TextView) row.findViewById(R.id.item_label);
        }
    }
}

MyItem类:

public class MyItem {
    public String label;
    public boolean myItemCheckBoolean;
}

使用ArrayAdapter

public class MyFragment extends Fragment {
....
private List<MyItem> myItems = new ArrayList<MyItem>();
....
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment__my_list, container, false);
    lv = (ListView)rootView.findViewById(R.id.my_list);

    // For example purposes, fill myItems with dummy data setting all checkboxes initially to false
    for (int i = 0; i < 10; i++) {
        MyItem myItem = new MyItem();
        myItem.label = "Item " + i;
        myItem.myItemCheckBoolean = false;
        myItems.add(myItem);
    }

    MyListAdapter adapter = new MyListAdapter(getActivity(), R.layout.my_list_item, myItems);
    adapter.setMyListAdapterListener( new MyListAdapter.MyListAdapterListener() {

        @Override
        public void onItemCheckClicked(int index) {
            Log.d("MyFragment", "Item " + index + " Check Clicked");
            // toggle the item's boolean
            myItems.get(index).myItemCheckBoolean = !myItems.get(index).myItemCheckBoolean;
        }

        @Override
        public void onItemLabelLongClicked(int index) {
            Log.d("MyFragment", "Item " + index + " Label LongClicked");
        }

    }

    lv.setAdapter(adapter);
    ....
    return rootView;
}

其他 在回复您的评论时,您可以使用适配器根据需要自定义列表项的显示。下面的版本显示了如何修改适配器以使用ImageView而不是CheckBox,还可以更改背景颜色:

public class MyListAdapter extends ArrayAdapter<MyItem> {

    // interface for handling item child view events
    public interface MyListAdapterListener {
        void onItemCheckClicked(int index);
        void onItemLabelLongClicked(int index);        
    }

    private MyListAdapterListener mMyListAdapterListener;
    int layoutResID;

    // Constructor
    public MyListAdapter(Context context, int resource, List<MyItem> myItems) {
        super(context, resource, myItems);
        layoutResID = resource;
    }

    public void setMyListAdapterListener(MyListAdapterListener listener) {
        this.mMyListAdapterListener = listener;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        // setup the row
        View row;
        if (convertView == null) {
            LayoutInflater inflater = LayoutInflater.from(getContext());
            row = inflater.inflate(layoutResID, null);
        } else {
            row = convertView;
        }

        // setup the ViewHolder for this item
        ViewHolder holder = (ViewHolder) row.getTag();
        if (holder == null) {
            holder = new ViewHolder(row);
            row.setTag(holder);
        }

        // setup this item's label view
        holder.label.setText(getItem(position).label);
        // tag this item's label view with position so it can be retrieved in the onLongClick
        holder.label.setTag(position);
        // set the OnLongClickListener for the this item's label view 
        holder.label.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                if (mActivityListListener != null) {
                // retrieve position from the view's tag, and trigger the listeners onItemLabelLongClicked method
                    mActivityListListener.onItemLabelLongClicked((Integer)v.getTag());
                }
                return false;
            }
        });

        // setup this item's image view based on the current state of the boolean
        if (getItem(position).myItemCheckBoolean) {
            holder.image.setImageResource(R.drawable.image_a);
        } else {
            holder.image.setImageResource(R.drawable.image_b);
        }
        // tag this item's image view with position so it can be retrieved in the onClick
        holder.image.setTag(position);
        // set the OnClickListener for the this item's image view 
        holder.image.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mMyListAdapterListener != null) {
                    // retrieve position from the view's tag, and trigger the listeners onItemCheckClicked method
                    mMyListAdapterListener.onItemCheckClicked((Integer) v.getTag());
                }                    
            }
        });

        // setup this item's background based on the current state of the boolean
        if (getItem(position).myItemCheckBoolean) {
            holder.layout.setBackgroundColor(Color.red);
        } else {
            holder.layout.setBackgroundColor(Color.white);
        }

        return row;
    }

    class ViewHolder {
        ImageView image = null;
        TextView label = null;
        RelativeLayout layout = null;

        // constructor
        ViewHolder(View row) {
            this.image = (ImageView) row.findViewById(R.id.item_image);
            this.label = (TextView) row.findViewById(R.id.item_label);
            this.layout = (RelativeLayout) row.findViewById(R.id.item_layout)
        }
    }
}