2014-09-21 46 views
1

我有一个与Android的列表视图的问题,我已经创建了一个列表视图,从SQLite数据库采用自定义ArrayAdapter的数据
我想显示一个图像视图,当用户选择一个项目,但是当我点击一个项目,图像(勾号)显示在其他3项
我不知道问题出在哪里确切地说,这里是我的适配器代码:ListView选择多个然后一个项目

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; 
} 

} 

谢谢

回答

0

为了避免ListViews等与观点回收问题,我包括在提供给ArrayAdapter的构造函数的项目数据List检查状态的boolean。我还提供我自己的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) 
     } 
    } 
} 
+0

谢谢您的回答,我会试试这个并让你知道它是否有效 – 2014-09-22 22:54:56

+0

没问题。我多次使用这种方法。如果您在实施时遇到任何具体问题,请更新您的问题并提供详细信息,我会尽力提供帮助。 – 2014-09-22 23:24:31

+0

谢谢,你能告诉我怎么可以用图像而不是复选框吗?并改变背景颜色 – 2014-09-23 05:06:16